因此我使用 puttygen 生成一个 DSA 私钥,然后将其导出为 OpenSSH 格式,下面是我在其上运行 OpenSSL 的 asn1parse 时得到的结果:
0:d=0 hl=4 l= 443 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER :00
7:d=1 hl=3 l= 129 prim: INTEGER :B9916796B7A3EFFD5CA36368186D0ED
193BE7FDD61CC6851174F3E9781A0C0CEA7473E528372F559A1DB2A7E049A9BEFAE2CAAC55527049
2A0CD55B59A48A53BCADD32181F519EA9E6A98EF8EF59DE314A2E69606C728F2F8DEE722B4C67BA6
8EB8A619B6006804F83740F9C74C38136522E7E83F22920AA39822FBDA0DF4D0B
139:d=1 hl=2 l= 21 prim: INTEGER :D832F5B01F075FEC0F162B91982F34D
B26A0CC29
162:d=1 hl=3 l= 129 prim: INTEGER :9B73F47AEFF8E39584FD10ACF81CCD5
75C96FC5558A5C94B941EF76318D132007ACAE1EA22E95CE0B13FC7875CE4D4ED33BA639CD8C2AC9
C0A0530FB7786F584A62EBAE5985E1C26ED0D0B9FDD5E8DB0142BE182A4E5359307007060C327FEE
C2F8D04EABB37D7B74076EB9BDB4885F627DE85708D5BDBF5177A05721E09A367
294:d=1 hl=3 l= 128 prim: INTEGER :6BD9267D2D1E4546EE05F6CD087F311
93C0EEB13B1E139F5072E900AB2EEF68EEC28BF4D7D6CAE4DEE59005F00BAE07343EE520C217FF6E
7880DC788E4555F78CCB5E89A10CDC71A663DA696C5BC34E296CEB3518D65A79BF00B6D592B1399A
9F0D79AE3F3FB445EE1F2B4B72515F036C8E1D5C7FAD336FD3503874645C5C264
425:d=1 hl=2 l= 20 prim: INTEGER :15295A12325E5F1A6F7243B7BB3BE74
6FE7B76E9
我的问题是...这种格式在哪里描述?例如,第一个 0 整数值是什么意思?
我想我可以查看 puttygen 源代码,但是是否有描述这种格式的 RFC 或其他东西?
答案1
私钥格式不是作为标准化为公钥格式,因为理想情况下它们永远不会被发送或接收 - 因此互操作性并不是一个大问题。
不过,关于该格式的文档可以在几个地方找到。它与PKCS#1 中描述的 RSAPrivateKey 结构,通常会在 PKCS#8 容器内进行存储。但是,在 PKCS#8 容器中存储 DSA 密钥的正常方式只是存储私有值x
,而不是存储那里的整个结构。我猜这是一种提议的但从未在技术上标准化的 DSAPrivateKey 格式,OpenSSL 在标准确定之前就实现了该格式。OpenSSLdsa
手册页显示:
带有私钥的 DER 选项使用 ASN1 DER 编码形式的 ASN.1 SEQUENCE,该 SEQUENCE 由版本(当前为零)、p、q、g、公钥和私钥组件的值分别作为 ASN.1 INTEGER 组成。
我猜测 OpenSSH 重复使用了该格式。PyCrypto 的 DSA 密钥实现中的注释强化这个想法;他们将该结构称为“DSAPrivatKey_OpenSSL”,并将其称为“自定义 OpenSSL/OpenSSH 编码”。