2017-11-02 14 views
0

제작 한 다수의 1024 비트 DER 인코딩 RSAPublicKeys openssl 명령과 함께 (PKCS # 1) :1024 비트 RSA 키 쌍에 대한 DER로 인코딩 된 RSAPublicKey (PKCS # 1)의 길이가 일정합니까?

openssl genrsa 1024 | openssl rsa -outform DER -RSAPublicKey_out -out pubkey.der 

지금까지 같이 생성 된 모든 공개 키 파일은 정확히 140 바이트하고있다. 이 형식에서 인코딩 된 1024 비트 RSA 공용 키는 항상 140 바이트입니까, 아니면이 크기가 다를 수 있습니까?

I've learned that the size of a DER encoded private key can vary.

+0

예, 크기는 다양 할 수 있습니다. '-RSAPublicKey_out'이 내 버전의 openssl에 유효한 옵션이 아니기 때문에 파이프의 두 번째 명령이 무엇인지 알 수 없습니다. –

답변

1

항상 F3의 지수 값 (0x010001)을 사용하여 1024 비트 키 140 바이트 일 것이다.

공개 키의 인코딩 pbpc 선택적 패딩 바이트 (제외되는 정수를 방지하기 위해) 및 XA-XC (및 Y/ZA-c)의 값이다

SEQUENCE (RSAPublicKey) 
30 xa [ya [za ...]] 
    INTEGER (n) 
    02 xb [yb [zb ...]] [pb] ... 
    INTEGER (e) 
    02 xc [yc [zc ...]] [pc] ... 

인 BER 길이입니다.

e가 0x010001이면 02 03 01 00 01으로 인코딩되며 항상 5 바이트입니다.

RSA 키의 키 크기는 첫 번째 설정된 비트로 시작하는 비트 문자열의 길이에 의해 결정됩니다. 따라서 1024 비트 키 값^1,023 2^1,024 (2) 사이에있을 것이고, 그것이 하이 비트가 설정되기 때문에

0b1xxx_xxxx {1016 other "don't care" bits} 

같을 것이다 숫자 패딩없이 마이너스이므로 것 1024 비트 숫자는 128 값 바이트로 인코딩되고 "부호 비트가 설정되지 않음"의 한 바이트 또는 129 바이트가 인코딩됩니다.

이제는 정수의 전체 인코딩 길이 인 129를 알 수 있습니다. 길이가 0x79 (가장 큰 "압축"BER 길이)보다 큰 16 진수 0x81이므로 길이가 긴 형식으로 작성됩니다. 다음 1 바이트 (s)로 표현됨) 0x81.

02 81 81 00 [128 more bytes representing n] 

는 그래서 e 5 바이트로 부호화하고 n는로 인코딩 (132) (128 + 1 + 2 + 1) 헥스 137

(137)은 시퀀스 길이를 0x81 0x89를 수있게 0x89를이다, . 137 바이트의 내용 + 길이의 2 바이트 + 태그의 1 바이트 => 140 바이트.

30 81 89 
    02 81 81 00 [128 more bytes of n] 
    02 03 01 00 01 

이 계산에서는 아무도 자신의 키 크기 정의에 문제가 없다고 가정합니다. 느슨한 해석 (http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Br1.pdf이 잘못된 경우)은 n의 값을 2^1016과 2^1024 사이에 넣을 것입니다 (일명 "128 바이트가 필요합니다. 어느 비트가 가장 높은 비트를 가집니까?"). 이 경우 패딩 바이트는 n에서 사라질 수 있으며 길이는 139로 줄어 듭니다.