1024 位 RSA 密钥对的 DER 编码 RSAPublicKey (PKCS #1) 的长度是否一致?
Is the length of a DER-encoded RSAPublicKey (PKCS #1) for a 1024-bit RSA key pair consistent?
我使用 openssl 命令创建了多个 1024 位 DER 编码的 RSAPublicKeys (PKCS #1):
openssl genrsa 1024 | openssl rsa -outform DER -RSAPublicKey_out -out pubkey.der
到目前为止,像这样创建的每个 public 密钥文件正好是 140 字节。以这种格式编码的 1024 位 RSA public 密钥是否总是 140 字节,或者这个大小可以变化吗?
I've learned that the size of a DER encoded private key can vary.
使用指数值 F4 (0x010001) 的 1024 位密钥应始终为 140 字节。
public键的编码是
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 个值字节和 "the sign bit isn't set" 的一个前导字节,即 129 个字节。
所以现在我们知道了整数的完整编码长度,129。这是十六进制的 0x81,大于 0x79(最大 "compact" 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(又名 "it required 128 bytes, who cares which bit is the highest one set?")之间。在那种情况下,填充字节可能会从 n
中消失并且长度会下降到 139.
我使用 openssl 命令创建了多个 1024 位 DER 编码的 RSAPublicKeys (PKCS #1):
openssl genrsa 1024 | openssl rsa -outform DER -RSAPublicKey_out -out pubkey.der
到目前为止,像这样创建的每个 public 密钥文件正好是 140 字节。以这种格式编码的 1024 位 RSA public 密钥是否总是 140 字节,或者这个大小可以变化吗?
I've learned that the size of a DER encoded private key can vary.
使用指数值 F4 (0x010001) 的 1024 位密钥应始终为 140 字节。
public键的编码是
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 个值字节和 "the sign bit isn't set" 的一个前导字节,即 129 个字节。
所以现在我们知道了整数的完整编码长度,129。这是十六进制的 0x81,大于 0x79(最大 "compact" 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(又名 "it required 128 bytes, who cares which bit is the highest one set?")之间。在那种情况下,填充字节可能会从 n
中消失并且长度会下降到 139.