인증서파일 예) MSCV-VSClass3.cer

-----BEGIN CERTIFICATE-----
MIIFAzCCAuugAwIBAgIKYQwSBgAAAAAAGzANBgkqhkiG9w0BAQUFADB/MQswCQYD
VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQDEyBNaWNyb3Nv
ZnQgQ29kZSBWZXJpZmljYXRpb24gUm9vdDAeFw0wNjA1MjMxNzAxMjlaFw0xNjA1
MjMxNzExMjlaMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j
LjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9u
IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyVxZnvIbigEU
tBDfBEDb41evakVAj4QMC9Ez2dkRz+4CWB8l9yqoRAWq7AMfeH+ek7maAKojfdas
haJjRcdyJ8z0TMZ1cdI5709C8HXfCpDGjiBvmA/4rCNfcCk2pMmG57GaIMtTpYXn
Pb59mv4kRTPcdhXtD6JxZExlLoFoRacCAwEAAaOCASMwggEfMBEGA1UdIAQKMAgw
BgYEVR0gADA2BgkrBgEEAYI3FQcEKTAnBh8rBgEEAYI3FQiN4NGJToTXnMMHhqaG
+xyP07+mFQEZAgFuAgEAMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0G
A1UdDgQWBBTif3vYd9Xfngo/nrTLDi6p79tpdzAdBgkrBgEEAYI3FAIEEB4OAEMA
cgBvAHMAcwBDAEEwHwYDVR0jBBgwFoAUYvsKIVt/Q24R2glUUGv10pZx8Z4wVQYD
VR0fBE4wTDBKoEigRoZEaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
cHJvZHVjdHMvTWljcm9zb2Z0Q29kZVZlcmlmUm9vdC5jcmwwDQYJKoZIhvcNAQEF
BQADggIBAAHkRrM7RX91E4d+X0PeRo7Lir22R0G8zMx0kdjOOVGVpKa1R8Dv0tp7
j1cR9DKMfM0/7kLaBCFK98hDiEpvXMoU/EvRn0y91FVuzAK+DaaIj4YJuqQlveiw
8PqLcU5nsMuCqNeOVfc36/A+iO/k4Ir9HG4uYUFIdbSwLB0o2EkP1xXwJHMlPMyI
DN4oTGVU/l6ujOoZrSxRsps6R/U8gDUBF+JJh9ZUSvtLqwe8v315z781AFy7ns/8
gokbOaBRl7bewLMH/0SWRMA0Khlcq+7wO+wpTrUTxTeFfnXVtNYNBm610mwjcWfq
8XGOr050qgz57L9MWPpekJttOcuGiD+LHKgWMtX+bbnx+LPq15H2Nkd4wCcqFcdo
1vTF/E9OyGc/EC1An/EeyWFI56cD/DFzDPBGiP5W2kkple8J2qPlvu9g7NlUoFmc
KL1U72YVf4dMhNumDpVnLlF7NDm2QcKMhGgm3CQCCeeBjgqXLe/up7mYpg+BjccQ
teHtmC9Ib1OFSWR4m+xdrJcLVSbD77qNyNGlL1p/k2thGjObGLiiYhDeJOp24S9D
6+zdfBI0JInaKFWu5XVOMStnY7ao16tzCgPOxepZP8frKkWuqGJbLwCZOau0X3PD
COyAEY9HDo8qE0PhkQZiVbv/uj2pqT0mD67KfWKLFVWJ1pQ0TdZl
-----END CERTIFICATE-----
 

1) 인증서파일의 "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----" 부분을 제외
    한 내용을 [버퍼_1] 에 담는다.

2) [버퍼_1] 을 base64Decode 함수를 통해 디코드하여 [디코드_1]을 얻는다.

3) [디코드_1] 을 CertCreateCertificateContext 함수의 인자로 입력하여 [컨텍스트_1]
    얻는다.

   예) [컨텍스트_1] = CertCreateCertificateContext (
                                                PKCS_7_ASN_ENCODING|X509_ASN_ENCODING,
                                                [디코드_1],
                                                [디코드_1]의 길이(base64Decode의 리턴값) );

4) CryptAcquireContext 함수를 호출하여 CSP의 KeyContainer를 위한 핸들을 얻는다.
    아래의 '예' 처럼 호출한다.

   예)  CryptAcquireContext(
                                                입력받을 [CSP핸들_1]의 주소,
                                                NULL,
                                                MS_DEF_PROV,
                                                PROV_RSA_FULL,
                                                NULL );

   * 참고 *
      Windows 2K에서 CryptEncrypt함수가 NTE_BAD_KEY오류로 실패하는 경우,
      MS_DEF_PROV 대신 MS_ENHANCED_PROV 를 입력

5) 획득한 [CSP핸들_1]의 객체에, 인증서에 포함된 공개키를 임포트한다.

   예)  CryptImportPublicKeyInfo(
                                                [CSP핸들_1],
                                                X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
                                                [컨텍스트_1]->pCertInfo->SubjectPublicKeyInfo 주소,
                                                입력받을 [공개키핸들_1]의 주소 )

6) 블록을 암호화한다.

   예)  CryptEncrypt(
                                                [공개키핸들_1],
                                                NULL,
                                                TRUE,
                                                0,
                                                [암호화대상버퍼_1] 주소,
                                                [암호화대상버퍼_1] 바이트 길이,
                                                버터의 최대 길이 )

7) [암호화대상버퍼_1] 을 base64Encode 함수를 통해 인코드한다.
  

만약, 암호화하는 측이 .NET framework 하위버전이 설치된 MS Windows를 사용한다면, 버퍼의 내용은 Little-Endian방식으로 정렬된다. 이것을 Big-Endian을 사용하는 JAVA 혹은 .NET framework상위버전의 시스템에서 복호화하게 되면 정상적으로 처리되지 않으므로, 6) 과 7)과정 사이에 아래의 과정이 추가되어야 한다.
([참고] http://www.jensign.com/JavaScience/dotnet/RSAEncrypt/index.html)


6.5) [암호화대상버퍼_1] 에 담긴 데이터를 Big Endian방식으로 변경한다.

   예)  [1][2][3][4][5][6][7] ... [100] : [암호화대상버퍼_1]의 바이트 들
                        |
                       변경
                         ↓
         [100][99][98][97][96] ... [1]

Posted by 울랄라베베
:

카테고리

분류 전체보기 (20)
Kernel programming (13)
User porgramming (2)
Etc... (2)