我使用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.
答案 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] ...
其中pb
和pc
是可选的填充字节(以防止整数为负),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。