RSA 公钥的格式是什么?

信息安全 密码学 RSA
2021-08-12 16:46:38

我有这个 RSA 公钥,我想从中获取模数指数部分,但无法获取它的编码格式。有人可以告诉如何解码吗?

-----BEGIN PUBLIC KEY-----
MIIBBgKBgDI/ranPo8MDfguQfSzqg7mtNlUJLLBK7tlVALyk42agbLTSFcZbs9Yw
t3nSe9yNzZB9ZVrL3O9GXkEb6xvj3dqrog+wWOeFCqNV7BuJNYYC/ef4vlnUFQdw
yswbd7d198qjWBZ7MiZRXxX8qKRln+osTvsDYOMZk93k0cGZgyuJAoGAHkgFohgA
nH93kDPjN4sHaT9WsmZ4ailbMtcnWuLizTRJ2sdGjNrpuwT1R+x1nlYHOeDUSOu6
De0kQJX+HZuQCoha6THsdgcV297krN22FwsDZ1PItXLIr5oC7zcNQaDyAJOIv6BC
ufHQ0IR+L9b9esniMbF8yV0d7EVAaBJiyRk=
-----END PUBLIC KEY-----
1个回答
$ cat > foo.txt
-----BEGIN PUBLIC KEY-----
MIIBBgKBgDI/ranPo8MDfguQfSzqg7mtNlUJLLBK7tlVALyk42agbLTSFcZbs9Yw
t3nSe9yNzZB9ZVrL3O9GXkEb6xvj3dqrog+wWOeFCqNV7BuJNYYC/ef4vlnUFQdw
yswbd7d198qjWBZ7MiZRXxX8qKRln+osTvsDYOMZk93k0cGZgyuJAoGAHkgFohgA
nH93kDPjN4sHaT9WsmZ4ailbMtcnWuLizTRJ2sdGjNrpuwT1R+x1nlYHOeDUSOu6
De0kQJX+HZuQCoha6THsdgcV297krN22FwsDZ1PItXLIr5oC7zcNQaDyAJOIv6BC
ufHQ0IR+L9b9esniMbF8yV0d7EVAaBJiyRk=
-----END PUBLIC KEY-----
$ openssl asn1parse -i -in foo.txt 
    0:d=0  hl=4 l= 262 cons: SEQUENCE          
    4:d=1  hl=3 l= 128 prim:  INTEGER           :323FADA9CFA3C3037E0B907D2CEA83B9AD3655092CB04AEED95500BCA4E366A06CB4D215C65BB3D630B779D27BDC8DCD907D655ACBDCEF465E411BEB1BE3DDDAABA20FB058E7850AA355EC1B89358602FDE7F8BE59D4150770CACC1B77B775F7CAA358167B3226515F15FCA8A4659FEA2C4EFB0360E31993DDE4D1C199832B89
  135:d=1  hl=3 l= 128 prim:  INTEGER           :1E4805A218009C7F779033E3378B07693F56B266786A295B32D7275AE2E2CD3449DAC7468CDAE9BB04F547EC759E560739E0D448EBBA0DED244095FE1D9B900A885AE931EC760715DBDEE4ACDDB6170B036753C8B572C8AF9A02EF370D41A0F2009388BFA042B9F1D0D0847E2FD6FD7AC9E231B17CC95D1DEC4540681262C919

你去吧。我在相当常规的 Linux 系统上使用了这些命令。

请注意,您的文件很奇怪。RSA 公钥包含两个整数,即模数 ( n ) 和公共指数 ( e )。它通常被编码为一个 ASN.1 结构,它是SEQUENCE两个INTEGER值中的一个。然后该结构应该是 DER 编码的,并且生成的字节序列将成为BIT STRING另一个外部 ASN.1 结构中的内容,该结构还包含密钥类型的显式标识符(即表明密钥确实是RSA 类型)。在您的情况下,缺少该外部结构,因此无论在编码的 ASN.1 结构中还是在 PEM 标头(“BEGIN PUBLIC KEY”)中,都没有正式表明密钥是 RSA 密钥。

作为 RSA 密钥,它看起来也有点奇怪。第一个整数,据称是模数,长度为 1022 位,这不是很常见(开发人员和密码学家真的很喜欢 2 的幂,所以如果他们有可能生成 1024,他们不会接受 1022 位整数位整数)。第二个整数,公共指数,非常大(1021 位);这得到了 RSA 的正式支持,但非常罕见:公共指数可以很短,而不会对安全性产生不良影响,这使得公共密钥操作更快,因此没有真正的理由使用大指数。一些广泛的实现(Windows CryptoAPI ...)甚至不支持大于 32 位的公共指数。

如果您拥有的确实是 RSA 公钥,那么很可能有人在拉您的腿——或者正在以不常见且可能很弱的方式做事。