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전체 구조가 아닌 개인 값만 저장하는 것입니다. 나는 이것이 표준이 정착되기 전에 OpenSSL이 구현한 제안되었지만 결코 기술적으로 표준화되지 않은 DSAPrivateKey 형식이라고 추측합니다. OpenSSL dsa매뉴얼 페이지는 다음과 같이 말합니다:

개인 키가 있는 DER 옵션은 버전(현재 0), p, q, g 값, 각각 ASN.1 INTEGER로서 공개 및 개인 키 구성 요소로 구성된 ASN.1 SEQUENCE의 ASN1 DER 인코딩 형식을 사용합니다.

그리고 나는 OpenSSH가 그 형식을 재사용했다고 추측합니다.PyCrypto의 DSA 키 구현에 대한 설명이 아이디어를 강화하십시오. 거기서 그들은 "DSAPrivatKey_OpenSSL" 구조를 호출하고 이를 "사용자 정의 OpenSSL/OpenSSH 인코딩"이라고 부릅니다.

관련 정보