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

Openssl 1024位RSA密钥对的DER编码RSAPublicKey(PKCS#1)的长度是否一致?,openssl,rsa,asn.1,pkcs#1,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字节,或者这种大小会有所不同 对于使用指数值F4(0x010001)的1024位密钥,它应始终为140字节 公钥的编码是 SEQUE

我使用openssl命令创建了多个1024位DER编码的RSAPublicKeys(PKCS#1):

openssl genrsa 1024 | openssl rsa -outform DER -RSAPublicKey_out -out pubkey.der
到目前为止,像这样创建的每个公钥文件都有140字节。1024位RSA公钥是否以这种格式编码始终为140字节,或者这种大小会有所不同


对于使用指数值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
,始终为5个字节

RSA密钥的密钥大小由从第一个设置的位开始的位字符串的长度决定。因此,对于1024位的键,该值将在2^1023和2^1024之间,它将如下所示

0b1xxx_xxxx {1016 other "don't care" bits}
由于设置了高位,因此该数字在没有填充的情况下为负数,因此1024位数字被编码为128个值字节和“符号位未设置”的一个前导字节,即129个字节

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

因此
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

此计算假设没有人对密钥大小的定义不满意。松散的解释(per是错误的)会使
n
的值介于2^1016和2^1024之间(即“它需要128字节,谁在乎哪个位是最高的?”)。在这种情况下,填充字节可能会从
n
中消失,长度将下降到139。

对于使用指数值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
,始终为5个字节

RSA密钥的密钥大小由从第一个设置的位开始的位字符串的长度决定。因此,对于1024位的键,该值将在2^1023和2^1024之间,它将如下所示

0b1xxx_xxxx {1016 other "don't care" bits}
由于设置了高位,因此该数字在没有填充的情况下为负数,因此1024位数字被编码为128个值字节和“符号位未设置”的一个前导字节,即129个字节

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

因此
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

此计算假设没有人对密钥大小的定义不满意。松散的解释(per是错误的)会使
n
的值介于2^1016和2^1024之间(即“它需要128字节,谁在乎哪个位是最高的?”)。在这种情况下,填充字节可能会从
n
中消失,长度将降至139。

是的,大小可能会有所不同。我不知道您管道中的第二个命令是什么,因为
-RSAPublicKey\u out
不是我的openssl版本的有效选项。
rsa-RSAPublicKey\u out
(以及
-RSAPublicKey\u in
)从2010年发布的1.0.0开始在openssl中实现,但直到1.0.0l 1.0.1f(2014年)和1.0.2(2015年)才出现在手册页中,直到1.1.0(2016年)才出现在使用信息中。是的,大小可能会有所不同。我不知道您管道中的第二个命令是什么,因为
-RSAPublicKey\u out
不是我的openssl版本的有效选项。
rsa-RSAPublicKey\u out
(以及
-RSAPublicKey\u in
)从2010年发布的1.0.0开始在openssl中实现,但直到1.0.0l 1.0.1f(2014年)和1.0.2(2015年)才出现在手册页中,直到1.1.0(2016)才出现在使用信息中。Nit:65537是F4(2^*(2^4)+1)而不是F3。否则完全同意。@dave_thompson_085哎呀,修正了。Nit:65537是F4(2^*(2^4)+1)而不是F3。否则完全同意。@dave_thompson_085哎呀,修正了。