RSA 공개 키 형식


139

RSA 공개 키 형식에 대한 설명서는 어디서 찾을 수 있습니까?

다음 형식의 RSA 공개 키 OpenSSH:

SSH-RSA AAAAB3NzaC1yc2EAAAABJQAAAQB / nAmOjTmezNUDKYvEeIRf2YnwM9 / uUG1d0BYsc8 / tRtx + RGi7N2lUbp728MXGwdnL9od4cItzky / zVdLZE2cycOa18xBK9cOWmcKS0A8FYBxEQWJ / q9YVUgZbFKfYGaGQxsER + A0w / fX8ALuk78ktP31K69LcQgxIsl7rNzxsoOQKJ / CIxOGMMxczYTiEoLvQhapFQMs3FL96didKr / QbrfB1WT6s3838SEaXfgZvLef1YB2xmfhbT9OXFE3FXvh2UPBfN ffE7iiayQf + / + 2XR 8j4N4bW30DiPtOQLGUrH1y5X / rpNZNlWW2 + jGIxqZtgWg7lTy3mXy5x836Sj / 6L

보안 쉘에서 사용하도록 형식화 된 동일한 공개 키 (RFC 4716-SSH (Secure Shell) 공개 키 파일 형식) :

---- BEGIN SSH2 PUBLIC KEY ----
AAAAB3NzaC1yc2EAAAABJQAAAQB/nAmOjTmezNUDKYvEeIRf2YnwM9/uUG1d0BYs
c8/tRtx+RGi7N2lUbp728MXGwdnL9od4cItzky/zVdLZE2cycOa18xBK9cOWmcKS
0A8FYBxEQWJ/q9YVUgZbFKfYGaGQxsER+A0w/fX8ALuk78ktP31K69LcQgxIsl7r
NzxsoOQKJ/CIxOGMMxczYTiEoLvQhapFQMs3FL96didKr/QbrfB1WT6s3838SEaX
fgZvLef1YB2xmfhbT9OXFE3FXvh2UPBfN+ffE7iiayQf/2XR+8j4N4bW30DiPtOQ
LGUrH1y5X/rpNZNlWW2+jGIxqZtgWg7lTy3mXy5x836Sj/6L
---- END SSH2 PUBLIC KEY ----

RSA 공개 키 (유의 서식이 같은 공개 키 - , 빈칸없이) :

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA+xGZ/wcz9ugFpP07Nspo6U17l0YhFiFpxxU4pTk3Lifz9R3zsIsu
ERwta7+fWIfxOo208ett/jhskiVodSEt3QBGh4XBipyWopKwZ93HHaDVZAALi/2A
+xTBtWdEo7XGUujKDvC2/aZKukfjpOiUI8AhLAfjmlcD/UZ1QPh0mHsglRNCmpCw
mwSXA9VNmhz+PiB+Dml4WWnKW/VHo2ujTXxq7+efMU4H2fny3Se3KYOsFPFGZ1TN
QSYlFuShWrHPtiLmUdPoP6CV2mML1tk+l7DIIqXrQhLUKDACeM5roMx0kLhUWB8P
+0uj1CNlNN4JRZlC7xFfqiMbFRU9Z4N6YwIDAQAB
-----END RSA PUBLIC KEY-----

base-64로 인코딩 된 데이터의 16 진 덤프 :

00 00 00 07 73 73 68 2d 72 73 61 00 00 00 01 25 00 00 01 00 7f 9c 09
8e 8d 39 9e cc d5 03 29 8b c4 78 84 5f d9 89 f0 33 df ee 50 6d 5d d0 
16 2c 73 cf ed 46 dc 7e 44 68 bb 37 69 54 6e 9e f6 f0 c5 c6 c1 d9 cb
f6 87 78 70 8b 73 93 2f f3 55 d2 d9 13 67 32 70 e6 b5 f3 10 4a f5 c3 
96 99 c2 92 d0 0f 05 60 1c 44 41 62 7f ab d6 15 52 06 5b 14 a7 d8 19 
a1 90 c6 c1 11 f8 0d 30 fd f5 fc 00 bb a4 ef c9 2d 3f 7d 4a eb d2 dc 
42 0c 48 b2 5e eb 37 3c 6c a0 e4 0a 27 f0 88 c4 e1 8c 33 17 33 61 38 
84 a0 bb d0 85 aa 45 40 cb 37 14 bf 7a 76 27 4a af f4 1b ad f0 75 59 
3e ac df cd fc 48 46 97 7e 06 6f 2d e7 f5 60 1d b1 99 f8 5b 4f d3 97 
14 4d c5 5e f8 76 50 f0 5f 37 e7 df 13 b8 a2 6b 24 1f ff 65 d1 fb c8 
f8 37 86 d6 df 40 e2 3e d3 90 2c 65 2b 1f 5c b9 5f fa e9 35 93 65 59 
6d be 8c 62 31 a9 9b 60 5a 0e e5 4f 2d e6 5f 2e 71 f3 7e 92 8f fe 8b

나는 몇 가지 형식이 있다는 것을 읽었습니다 🕗 :

키 데이터는 세 가지 일반적인 방식으로 인코딩 될 수 있습니다.

  • 이진 DER로 인코딩 된 형식입니다. 이것을 때때로 ASN이라고합니다 .1 BER 인코딩
  • PEM 또는 base64 형식 이것은 DER로 인코딩 된 파일과 동일한 데이터이지만 추가 헤더 및 바닥 글 줄을 사용하여 base64로 인코딩됩니다.
  • XML 형식.

그것의 경우 ASN.1 , 헥스는 확실히처럼 보이지 않는다.

RSA 공개 키의 형식은 무엇입니까?


또한보십시오

답변:


68

구분 기호를에서 ---- BEGIN SSH2 PUBLIC KEY ----로 변경하고 -----BEGIN RSA PUBLIC KEY-----한 형식에서 다른 형식으로 변환하기에 충분하다고 기대할 수는 없습니다 (이 예제에서 수행 한 작업).

이 기사 에는 두 형식에 대한 좋은 설명이 있습니다.

에 들어가는 것은 RSA PUBLIC KEY의 내용에 더 가깝지만 PUBLIC KEYASN.1 구조의 시작 부분을 오프셋하여 PUBLIC KEY키 유형이 무엇인지 나타내는 지표가 있음을 반영해야합니다 ( RFC 3447 참조 ). 당신은 사용이 볼 수 openssl asn1parse-strparse 19에 설명 된대로 이 대답 .

편집 : 편집 후 다음을 RSA PUBLIC KEY사용 하여 구조 의 세부 정보를 얻을 수 있습니다 grep -v -- ----- | tr -d '\n' | base64 -d | openssl asn1parse -inform DER.

    0:d=0  hl=4 l= 266 cons: SEQUENCE          
    4:d=1  hl=4 l= 257 prim: INTEGER           :FB1199FF0733F6E805A4FD3B36CA68E94D7B974621162169C71538A539372E27F3F51DF3B08B2E111C2D6BBF9F5887F13A8DB4F1EB6DFE386C92256875212DDD00468785C18A9C96A292B067DDC71DA0D564000B8BFD80FB14C1B56744A3B5C652E8CA0EF0B6FDA64ABA47E3A4E89423C0212C07E39A5703FD467540F874987B209513429A90B09B049703D54D9A1CFE3E207E0E69785969CA5BF547A36BA34D7C6AEFE79F314E07D9F9F2DD27B72983AC14F1466754CD41262516E4A15AB1CFB622E651D3E83FA095DA630BD6D93E97B0C822A5EB4212D428300278CE6BA0CC7490B854581F0FFB4BA3D4236534DE09459942EF115FAA231B15153D67837A63
  265:d=1  hl=2 l=   3 prim: INTEGER           :010001

SSH 키 형식을 디코딩하려면 RFC 4253과 함께 RFC 4251 의 데이터 형식 사양도 사용해야합니다 .

   The "ssh-rsa" key format has the following specific encoding:

      string    "ssh-rsa"
      mpint     e
      mpint     n

예를 들어 처음에는을 얻습니다 00 00 00 07 73 73 68 2d 72 73 61. 처음 4 바이트 ( 00 00 00 07)는 길이를 제공합니다. 나머지는 문자열 자체입니다 : 73 = s, 68 = h, ...-> 73 73 68 2d 72 73 61= ssh-rsa, 길이 1 ( 00 00 00 01 25) 및 길이 256 ( 00 00 01 00 7f ...) 의 지수가 이어집니다 .


2
이 기사 에서는 OpenSSH 형식 형식이지만 형식의 세부 사항은 다루지 않습니다. 대신 형식은 RFC 4253-SSH (Secure Shell) 전송 계층 프로토콜-섹션 6.6에 완전히 문서화되어 있다고 언급합니다 . 공개 키 알고리즘 ; 내가 문서를 찾을 수 없다는 것을 제외하고. 내가 찾은 누군가의 공개 RSA 키를 사용하도록 질문을 업데이트했습니다.
Ian Boyd

내가 처음 링크로 이동 가지고 있다고 생각 blog.oddbit.com/2011/05/08/converting-openssh-public-keys
mbargiel

데이터 또는 다른 PEM 구조 openssl asn1parse -inform PEM와 함께 사용할 수 있습니다 -----BEGIN RSA PUBLIC KEY----. grep / tr / base64 명령으로 헤더를 수동으로 조작하는 것보다 훨씬 쉽습니다.
davenpcj

55

OpenSSL rsa-ssh Key 의 디코딩 된 base64 데이터부터 시작 하여 형식 을 추측 할 수있었습니다 .

  • 00 00 00 07: 4 바이트 길이 접두사 (7 바이트)
  • 73 73 68 2d 72 73 61: "ssh-rsa"
  • 00 00 00 01: 4 바이트 길이 접두사 (1 바이트)
  • 25: RSA 지수 ( e) : 25
  • 00 00 01 00: 4 바이트 길이 접두사 (256 바이트)
  • RSA 계수 ( n) :

    7f 9c 09 8e 8d 39 9e cc d5 03 29 8b c4 78 84 5f
    d9 89 f0 33 df ee 50 6d 5d d0 16 2c 73 cf ed 46 
    dc 7e 44 68 bb 37 69 54 6e 9e f6 f0 c5 c6 c1 d9 
    cb f6 87 78 70 8b 73 93 2f f3 55 d2 d9 13 67 32 
    70 e6 b5 f3 10 4a f5 c3 96 99 c2 92 d0 0f 05 60 
    1c 44 41 62 7f ab d6 15 52 06 5b 14 a7 d8 19 a1 
    90 c6 c1 11 f8 0d 30 fd f5 fc 00 bb a4 ef c9 2d 
    3f 7d 4a eb d2 dc 42 0c 48 b2 5e eb 37 3c 6c a0 
    e4 0a 27 f0 88 c4 e1 8c 33 17 33 61 38 84 a0 bb 
    d0 85 aa 45 40 cb 37 14 bf 7a 76 27 4a af f4 1b 
    ad f0 75 59 3e ac df cd fc 48 46 97 7e 06 6f 2d 
    e7 f5 60 1d b1 99 f8 5b 4f d3 97 14 4d c5 5e f8 
    76 50 f0 5f 37 e7 df 13 b8 a2 6b 24 1f ff 65 d1 
    fb c8 f8 37 86 d6 df 40 e2 3e d3 90 2c 65 2b 1f 
    5c b9 5f fa e9 35 93 65 59 6d be 8c 62 31 a9 9b 
    60 5a 0e e5 4f 2d e6 5f 2e 71 f3 7e 92 8f fe 8b
    

내 이론의 가장 가까운 검증은 RFC 4253에서 찾을 수 있습니다.

"ssh-rsa"키 형식에는 다음과 같은 특정 인코딩이 있습니다.

  string    "ssh-rsa"
  mpint     e
  mpint     n

여기서 'e'및 'n'매개 변수는 서명 키 Blob을 구성합니다.

그러나 길이 접두사를 설명하지는 않습니다.


RSA PUBLIC KEY내가 찾은 무작위 (문제에서)를 취하고 base64를 16 진수로 디코딩합니다.

30 82 01 0a 02 82 01 01 00 fb 11 99 ff 07 33 f6 e8 05 a4 fd 3b 36 ca 68 
e9 4d 7b 97 46 21 16 21 69 c7 15 38 a5 39 37 2e 27 f3 f5 1d f3 b0 8b 2e 
11 1c 2d 6b bf 9f 58 87 f1 3a 8d b4 f1 eb 6d fe 38 6c 92 25 68 75 21 2d 
dd 00 46 87 85 c1 8a 9c 96 a2 92 b0 67 dd c7 1d a0 d5 64 00 0b 8b fd 80 
fb 14 c1 b5 67 44 a3 b5 c6 52 e8 ca 0e f0 b6 fd a6 4a ba 47 e3 a4 e8 94 
23 c0 21 2c 07 e3 9a 57 03 fd 46 75 40 f8 74 98 7b 20 95 13 42 9a 90 b0 
9b 04 97 03 d5 4d 9a 1c fe 3e 20 7e 0e 69 78 59 69 ca 5b f5 47 a3 6b a3 
4d 7c 6a ef e7 9f 31 4e 07 d9 f9 f2 dd 27 b7 29 83 ac 14 f1 46 67 54 cd 
41 26 25 16 e4 a1 5a b1 cf b6 22 e6 51 d3 e8 3f a0 95 da 63 0b d6 d9 3e 
97 b0 c8 22 a5 eb 42 12 d4 28 30 02 78 ce 6b a0 cc 74 90 b8 54 58 1f 0f 
fb 4b a3 d4 23 65 34 de 09 45 99 42 ef 11 5f aa 23 1b 15 15 3d 67 83 7a 
63 02 03 01 00 01

에서 RFC3447 - 공개 키 암호화 표준 (PKCS) # 1 : RSA 암호화 사양 버전 2.1 :

A.1.1 RSA 공개 키 구문

RSA 공개 키는 ASN.1 유형으로 표시되어야합니다 RSAPublicKey.

  RSAPublicKey ::= SEQUENCE {
     modulus           INTEGER,  -- n
     publicExponent    INTEGER   -- e
  }

RSAPublicKey 유형의 필드는 다음과 같은 의미를 갖습니다.

  • 계수는 RSA 계수 n입니다.
  • publicExponent는 RSA 공개 지수입니다. e.

Microsoft의 우수하고 유일한 ASN.1 설명서 사용 :

30 82 01 0a       ;SEQUENCE (0x010A bytes: 266 bytes)
|  02 82 01 01    ;INTEGER  (0x0101 bytes: 257 bytes)
|  |  00          ;leading zero because high-bit, but number is positive
|  |  fb 11 99 ff 07 33 f6 e8 05 a4 fd 3b 36 ca 68 
|  |  e9 4d 7b 97 46 21 16 21 69 c7 15 38 a5 39 37 2e 27 f3 f5 1d f3 b0 8b 2e 
|  |  11 1c 2d 6b bf 9f 58 87 f1 3a 8d b4 f1 eb 6d fe 38 6c 92 25 68 75 21 2d 
|  |  dd 00 46 87 85 c1 8a 9c 96 a2 92 b0 67 dd c7 1d a0 d5 64 00 0b 8b fd 80 
|  |  fb 14 c1 b5 67 44 a3 b5 c6 52 e8 ca 0e f0 b6 fd a6 4a ba 47 e3 a4 e8 94 
|  |  23 c0 21 2c 07 e3 9a 57 03 fd 46 75 40 f8 74 98 7b 20 95 13 42 9a 90 b0 
|  |  9b 04 97 03 d5 4d 9a 1c fe 3e 20 7e 0e 69 78 59 69 ca 5b f5 47 a3 6b a3 
|  |  4d 7c 6a ef e7 9f 31 4e 07 d9 f9 f2 dd 27 b7 29 83 ac 14 f1 46 67 54 cd 
|  |  41 26 25 16 e4 a1 5a b1 cf b6 22 e6 51 d3 e8 3f a0 95 da 63 0b d6 d9 3e 
|  |  97 b0 c8 22 a5 eb 42 12 d4 28 30 02 78 ce 6b a0 cc 74 90 b8 54 58 1f 0f 
|  |  fb 4b a3 d4 23 65 34 de 09 45 99 42 ef 11 5f aa 23 1b 15 15 3d 67 83 7a 
|  |  63 
|  02 03          ;INTEGER (3 bytes)
|     01 00 01

공개 키 모듈러스 및 지수 제공 :

  • 계수 =0xfb1199ff0733f6e805a4fd3b36ca68...837a63
  • 지수 = 65,537

업데이트 : 다른 질문 에서이 답변의 확장 된 형태


1
RSA PUBLIC KEYASN.1 형식 (PKCS 사양 참조)을 따르며 OpenSSH 형식과 관련이 없습니다.
Bruno

3
좋은 답변-정말 감사합니다. "높은 비트이지만 숫자가 양수이므로 선행 0"은 소스에 따라 ssh-rsa 키 형식으로 만듭니다. 내가 찾을 수있는 가장 유용한 힌트는 github.com/openssh/openssh-portable의 주석으로 "/ * MSB가 설정된 경우 ssh-rsa 형식으로 큰 숫자를 쓸 때 \ 0 * /"를 붙입니다. 이것은 생성 된 RSA 키의 특성으로 인해 공개 계수가 50 % (?) 일 때만 문제가되고 공개 지수에는 문제가되지 않습니다.
팀 포터

훌륭한 답변, string그리고 mpint -RFC 4251, 섹션 5에 설명되어 있습니다. :)
user1516873

10

CRL, CRT, CSR, NEW CSR, PRIVATE KEY, PUBLIC KEY, RSA, RSA 공개 키 파서의 참조 디코더

RSA 공개 키

-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----

암호화 된 개인 키

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
-----END RSA PRIVATE KEY-----

CRL

-----BEGIN X509 CRL-----
-----END X509 CRL-----

CRT

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

CSR

-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST-----

새로운 CSR

-----BEGIN NEW CERTIFICATE REQUEST-----
-----END NEW CERTIFICATE REQUEST-----

PEM

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

PKCS7

-----BEGIN PKCS7-----
-----END PKCS7-----

개인 키

-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----

DSA 키

-----BEGIN DSA PRIVATE KEY-----
-----END DSA PRIVATE KEY-----

타원 곡선

-----BEGIN EC PRIVATE KEY-----
-----END EC PRIVATE KEY-----

PGP 개인 키

-----BEGIN PGP PRIVATE KEY BLOCK-----
-----END PGP PRIVATE KEY BLOCK-----

PGP 공개 키

-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.