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

개인키 생성

openssl genrsa -out privatekey.pem 1024

개인키 정보 출력

openssl rsa -in privatekey.pem -text -out private.txt

modulus : 00을 제외하고 128개, 128*8 = 1024bit

prime1, prime2 : 00을 제외하고 64개, 64*8 = 512bit

modulus(N) = prime1(P) * prime2(Q)

공개키 : publicExponent(65537), N

개인키 : privateExponent(D), N

exponent1 : D mod (P-1)

exponent2 : D mod (Q-1)

coefficient : (inverse of Q) mod P

공개키 생성

openssl pkey -in privatekey.pem -pubout -out publickey.pem

공개키 정보 출력

openssl pkey -in privatekey.pem -text_pub


64비트 키 검증

http://www.mathpapa.com/algebra-calculator.html 로 계산 가능

Private-Key: (64 bit)

modulus: 00:c6:cf:f1:d2:1c:ba:3d:bb

publicExponent: 65537 (0x10001)

privateExponent: 0f:04:29:c9:88:d9:02:61

prime1: 3825875939 (0xe40a3be3)

prime2: 3744484937 (0xdf304e49)

exponent1: 553066949 (0x20f721c5)

exponent2: 2212512545 (0x83e04321)

coefficient: 2971090683 (0xb1173efb) 


p * q = modulus = 14325934824416231424 (C6CFF1D21CBA3DBB)



RSA 구조체를 PEM으로 변환하는 방법입니다.

파일 혹은 버퍼로 저장할 수 있습니다.

+ Recent posts