DSA 私钥格式

DSA 私钥格式

因此我使用 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 编码”。

相关内容