그래서 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
전체 구조가 아닌 개인 값만 저장하는 것입니다. 나는 이것이 표준이 정착되기 전에 OpenSSL이 구현한 제안되었지만 결코 기술적으로 표준화되지 않은 DSAPrivateKey 형식이라고 추측합니다. OpenSSL dsa
매뉴얼 페이지는 다음과 같이 말합니다:
개인 키가 있는 DER 옵션은 버전(현재 0), p, q, g 값, 각각 ASN.1 INTEGER로서 공개 및 개인 키 구성 요소로 구성된 ASN.1 SEQUENCE의 ASN1 DER 인코딩 형식을 사용합니다.
그리고 나는 OpenSSH가 그 형식을 재사용했다고 추측합니다.PyCrypto의 DSA 키 구현에 대한 설명이 아이디어를 강화하십시오. 거기서 그들은 "DSAPrivatKey_OpenSSL" 구조를 호출하고 이를 "사용자 정의 OpenSSL/OpenSSH 인코딩"이라고 부릅니다.