DSA-Privatschlüsselformat

DSA-Privatschlüsselformat

Also habe ich Puttygen verwendet, um einen privaten DSA-Schlüssel zu generieren und diesen dann in das OpenSSH-Format exportiert. Folgendes habe ich erhalten, als ich OpenSSLs asn1parse darauf ausgeführt habe:

    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

Meine Frage ist... wo wird dieses Format beschrieben? Was bedeutet beispielsweise der erste ganzzahlige Wert 0?

Ich schätze, ich könnte im Puttygen-Quellcode nachsehen, aber gibt es ein RFC, das dieses Format oder so etwas beschreibt?

Antwort1

Private-Key-Formate sind nichtalsals Public-Key-Formate standardisiert, da sie im Idealfall nie gesendet oder empfangen werden – Interoperabilität stellt daher kein so großes Problem dar.

Allerdings gibt es an mehreren Stellen Dokumentationen zu diesem Format. Es ist sehr ähnlich demRSAPrivateKey-Struktur beschrieben in PKCS#1, das normalerweise in einem PKCS#8-Container transportiert wird. Die normale Art, einen DSA-Schlüssel in einem PKCS#8-Container zu speichern, besteht jedoch darin, nur den privaten Wert zu speichern x, nicht die gesamte Struktur, die Sie dort haben. Ich vermute, dass es sich um ein vorgeschlagenes, aber nie technisch standardisiertes DSAPrivateKey-Format handelt, das OpenSSL implementiert hat, bevor sich die Standards etablierten. Auf der OpenSSL- dsaManpage heißt es:

Die DER-Option mit einem privaten Schlüssel verwendet eine ASN1-DER-codierte Form einer ASN.1-SEQUENZ, die aus den Werten der Version (derzeit Null), p, q, g, den öffentlichen und privaten Schlüsselkomponenten jeweils als ASN.1-GANZZAHLEN besteht.

und ich vermute, dass OpenSSH dieses Format wiederverwendet hat.Die Kommentare in PyCryptos DSA-Schlüsselimplementierungbekräftigen diese Idee; dort nennen sie die Struktur „DSAPrivatKey_OpenSSL“ und bezeichnen sie als „die benutzerdefinierte OpenSSL/OpenSSH-Verschlüsselung“.

verwandte Informationen