인증서파일 예) MSCV-VSClass3.cer
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]