【问题标题】:Is the length of a DER-encoded RSAPublicKey (PKCS #1) for a 1024-bit RSA key pair consistent?1024 位 RSA 密钥对的 DER 编码 RSAPublicKey (PKCS #1) 的长度是否一致?
【发布时间】:2018-04-15 14:07:23
【问题描述】:

我使用 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.

【问题讨论】:

  • 是的,大小可能会有所不同。我不知道管道中的第二个命令是什么,因为 -RSAPublicKey_out 不是我的 openssl 版本的有效选项。
  • rsa -RSAPublicKey_out(以及 -RSAPublicKey_in)自 2010 年发布的 1.0.0 起在 OpenSSL 中实现,但直到 1.0.0l 1.0.1f(均为 2014 年)才出现在手册页中1.0.2 (2015),直到 1.1.0 (2016) 才出现在使用消息中。

标签: openssl rsa asn.1 pkcs#1


【解决方案1】:

对于使用指数值 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 个字节。

所以现在我们知道整数的完整编码长度,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。

【讨论】:

  • Nit: 65537 是 F4 (2^*(2^4)+1) 而不是 F3。否则完全同意。
  • @dave_thompson_085 哎呀,修复了。
猜你喜欢
  • 2015-02-16
  • 2014-06-24
  • 2017-06-29
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2017-04-16
相关资源
最近更新 更多