对于1024位RSA密钥对,DER编码的RSAPublicKey(PKCS#1)的长度是否一致?

时间:2017-11-02 22:32:53

标签: openssl rsa asn.1 pkcs#1

我使用openssl命令创建了多个1024位DER编码的RSAPublicKeys(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.

1 个答案:

答案 0 :(得分:2)

使用指数值F4(0x010001)的1024位密钥应始终为140字节。

公钥的编码是

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

其中pbpc是可选的填充字节(以防止整数为负),xa-xc(和y / za-c)值是BER长度。

如果e是0x010001,那么它编码为02 03 01 00 01,总是5个字节。

RSA密钥的密钥大小由以第一个设置位开始的位串长度决定。因此,对于1024位密钥,该值将介于2 ^ 1023和2 ^ 1024之间,并且它看起来像

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

由于设置了高位,所以在没有填充的情况下数字为负数,因此1024位数被编码为128个值字节和“符号位未设置”的一个前导字节,或129个字节。 / p>

所以现在我们知道整数的完整编码长度为129.这是十六进制的0x81,大于0x79(最大的“紧凑”BER长度),因此长度以长整数形式写入:0x81(表示长度)在接下来的1个字节中)0x81。

02 81 81 00 [128 more bytes representing n]

所以e编码为5个字节,n编码为132(128 + 1 + 2 + 1),即137。

十六进制的137是0x89,使序列长度为0x81 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。