본문 바로가기
Back-end/JAVA & Spring

[RSA] RSA MODULUS, EXPONENT

by 꼬바리 2021. 5. 20.

RSA키는 비대칭키로 개인키와 공개키로 되어있습니다.

 

여기서 공개키와 개인키는 위에서 보시는 것과 같이 구조가 되어 있습니다.

 

일반적으로

공개키는 n값과 e 값으로 구성되어 있습니다.

n값은 Modulus이며 e값은 Public exponent값입니다.

 

개인키는 기본적으로 n, e, d, p, q, exponent1, exponent2, coefficient 값을 갖습니다. 여기서 가장 필요한 값은 d 값입니다. 개인키의 각 데이터는 공개키의 데이터를 포함합니다.

위의 RSAKeyValue에 해당하는 필드로 바꾸면

n : Modulus

e:  Exponent

p : P

q : Q

exponent1 : DP

exponent2 : DQ

coefficient : InverseQ

d : D

 

위의 XML 데이터(링크에서 확인)는 모두 문자열을 담고 있기 때문에 바이너리인 이 데이터들을 담기 위해서는 인코딩이 필요합니다. 여기서 사용되는 인코딩이 Base64인코딩입니다.

 

예를 들어서 RSAKeyValue/Exponent 값은 AQAB라고 되어 있는 BASE64 DECODING을 해보면 0x01 0x00 0x01 값이 나오지요. 이 값은 10진수로 65537로 현재 가장 많이 사용되는 exponent 값입니다. (자세한 사항은 암호에 대해서 아셔야겠죠?)

 

1. RSAKeyValue/Modulus 데이터(n)를 BASE64 디코딩한다.

2. 디코딩된 byte[] 값을 Java의 Modulus 값에 대입한다.

3. RSAKeyValue/Exponent 데이터(e)를 BASE64 디코딩한다.

4. 디코딩된 byte [] 값을 Java의 Exponent 값에 대입한다.

 

이와 같은 방법을 사용하면 공개키 데이터를 얻을 수 있습니다.

 

위에 보여주신 데이터에서 분명 공개키/개인키라고 데이터를 보여주셨는데 공개키와 개인키 값이 똑같네요. 잘못 올려주신것이 아닌지?

 

개인키에는 n값(반드시 필요함), d값(반드시 필요함), e, p, q, exponent1, exponent2, coefficient 값이 존재해야 합니다.

마찬가지로 BASE64 디코딩하신다음에 Java의 개인키에 해당하는 데이터를 넣으시면 될듯 합니다.

 

파싱방법으로는 MSXML 파서를 사용하셔도 되나 간단한 XML 파서로도 저정도 데이터는 파싱이 가능할 듯합니다.

작업 환경이 Java라면 JCE에서 사용하셔야 할것입니다.

 

JAVA 환경을 예로 간단히 알려드리겠습니다.

기존에 생성된 개인키,공개키 쌍으로 작업을 하려면

 

1.RSAPublicKeySpec/RSAPrivateKeySpec 으로 기존 데이터들을 입력하여 KeySpec 생성

1-1.만약 개인키의 경우 p,q,exponent1, exponent2, coeffient 값이 존재한다면 RSAPrivateCrtKeySpec으로 생성 (중국인의 나머지 정리(CRT)에 의한 연산 방법으로 속도가 빠릅니다.)

2.KeyFactory를 통해서 키 생성

3.생성된 키를 통해서 연산

 

혹시 RSA키와 관련되서 더 궁금하셔서 보셔야겠다면 PKCS#1 표준을 보셔야 할것입니다.

 

출처 : https://imhotk.tistory.com/1133

728x90
반응형

댓글