Windows 10 기준으로,
C:\Program Files\NPKI\yessign\USER 디렉토리를 보면 공인인증서가 있습니다.
signCert.crt / signPri.key
signPri.key에서 개인키를 추출하고 RSA구조체로 변환할 것입니다.
1. SEED 대칭키 / IV 구하기
1) 개인키 파일에서 salt와 iteration 값을 추출합니다. PKCS#8 규격에 맞춰서 추출합니다.
# 8바이트 salt 추출하기 (20번째 바이트에서 8바이트 추출)
BYTE bySalt[8] = { 0, };
memcpy_s(bySalt, 8, (BYTE*)byFileBuffer + 20, 8);
# iteration 값 추출하기 (30번째 바이트에서 2바이트 추출)
WORD wIteration = _byteswap_ushort(*((WORD*)byFileBuffer + 15));
빅 엔디언을 리틀 엔디언으로 변경해줍니다.
2) KEY와 IV만들기
공인인증서 개인키는 SEED-CBC-128로 암호화되어 있습니다.
복호화할 KEY와 IV를 PBKDF1규격에 따라 만듭니다.
공인인증서 패스워드에 salt를 붙인다음 iteration 값 만큼 SHA1하며, 최종 값에서 첫 16바이트를 KEY로 사용합니다.
최종 HASH값에서 뒤 4바이트를 잘라낸 뒤 SHA1하여 DIV를 만듭니다. DIV에서 앞 16바이트를 잘라서 IV로 사용합니다.
2. SEED로 개인키 복호화
1에서 구한 키와 IV로 SEED-CBC-128 복호화하면 ASN.1 DER형태의 바이너리가 나옵니다.
복호화 할 오프셋은 파일의 36번째부터 끝까지입니다.
3. RSA 구조체로 변경하기
ASN.1을 PKCS8 구조체로 변환 후 RSA구조체로 변환합니다.
4. 개인키로 평문 암호화
'PKI' 카테고리의 다른 글
전자서명(pkcs#7)과 전자봉투 (0) | 2019.12.22 |
---|---|
openssl rsa 키 생성 테스트 (1) | 2016.01.01 |
[OpenSSL] Convert RSA Structure to PEM (0) | 2014.12.16 |