Định dạng khóa công khai RSA


139

Tôi có thể tìm một số tài liệu về định dạng của khóa công khai RSA ở đâu?

Khóa công khai RSA được định dạng bởi OpenSSH:

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

Cùng một khóa công khai được định dạng để sử dụng trong Secure Shell (RFC 4716 - Định dạng tệp khóa công khai Secure Shell (SSH)) :

---- 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 ----

Khóa công khai tương tự được định dạng là khóa chung RSA (lưu ý năm - và không có khoảng trắng):

-----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-----

Kết xuất hex của dữ liệu được mã hóa cơ sở 64:

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

Tôi đã đọc được rằng có một vài định dạng 🕗 :

Dữ liệu chính có thể được mã hóa theo ba cách chung:

  • Định dạng mã hóa DER nhị phân. Điều này đôi khi được gọi là mã hóa ASN.1 BER
  • Định dạng PEM hoặc base64. Đây là dữ liệu giống như tệp được mã hóa DER nhưng nó được mã hóa trong cơ sở64 với các dòng tiêu đề và chân trang bổ sung
  • Định dạng XML.

Nếu là ASN.1 , hex chắc chắn không giống như vậy.

Định dạng của khóa công khai RSA là gì?


Xem thêm

Câu trả lời:


68

Bạn không thể thay đổi các dấu phân cách từ ---- BEGIN SSH2 PUBLIC KEY ----sang -----BEGIN RSA PUBLIC KEY-----và hy vọng rằng nó sẽ đủ để chuyển đổi từ định dạng này sang định dạng khác (đó là những gì bạn đã thực hiện trong ví dụ của mình).

Bài viết này có một lời giải thích tốt về cả hai định dạng.

Những gì bạn nhận RSA PUBLIC KEYđược gần với nội dung của a PUBLIC KEY, nhưng bạn cần bù lại phần bắt đầu của cấu trúc ASN.1 để phản ánh thực tế PUBLIC KEYcũng có một chỉ báo cho biết đó là loại khóa nào (xem RFC 3447 ). Bạn có thể thấy điều này bằng cách sử dụng openssl asn1parse-strparse 19, như được mô tả trong câu trả lời này .

EDIT : Sau khi chỉnh sửa, bạn có thể nhận được các chi tiết về RSA PUBLIC KEYcấu trúc của mình bằng cách sử dụng 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

Để giải mã định dạng khóa SSH, bạn cũng cần sử dụng đặc tả định dạng dữ liệu trong RFC 4251 , kết hợp với RFC 4253:

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

      string    "ssh-rsa"
      mpint     e
      mpint     n

Ví dụ, lúc đầu, bạn nhận được 00 00 00 07 73 73 68 2d 72 73 61. Bốn byte đầu tiên ( 00 00 00 07) cung cấp cho bạn độ dài. Phần còn lại là chính chuỗi: 73 = s, 68 = h, ... -> 73 73 68 2d 72 73 61= ssh-rsa, theo sau là số mũ của chiều dài 1 ( 00 00 00 01 25) và mô đun có độ dài 256 ( 00 00 01 00 7f ...).


2
Bài viết đó đề cập rằng định dạng OpenSSH một định dạng, nhưng không đi sâu vào chi tiết của định dạng. Thay vào đó, nó đề cập rằng định dạng được ghi lại đầy đủ trong RFC 4253 - Giao thức lớp vận chuyển Secure Shell (SSH) - Phần 6.6. Thuật toán khóa công khai ; ngoại trừ tôi không thể tìm thấy bất kỳ tài liệu nào ở đó. tôi đã cập nhật câu hỏi để sử dụng khóa RSA công khai của ai đó mà tôi đã tìm thấy.
Ian Boyd

Tôi tin rằng liên kết đầu tiên đã được chuyển đến blog.oddbit.com/2011/05/08/converting-openssh-public-keys
mbargiel

Bạn có thể sử dụng openssl asn1parse -inform PEMvới -----BEGIN RSA PUBLIC KEY----dữ liệu hoặc bất kỳ cấu trúc PEM nào khác. Dễ dàng hơn nhiều so với cố gắng thao tác thủ công các tiêu đề bằng các lệnh grep / tr / base64.
davenpcj

55

Bắt đầu từ dữ liệu cơ sở 64 được giải mã của Khóa rsa-ssh OpenSSL , tôi đã có thể đoán định dạng:

  • 00 00 00 07: tiền tố có độ dài bốn byte (7 byte)
  • 73 73 68 2d 72 73 61: "ssh-rsa"
  • 00 00 00 01: tiền tố có độ dài bốn byte (1 byte)
  • 25: Số mũ RSA ( e): 25
  • 00 00 01 00: tiền tố có độ dài bốn byte (256 byte)
  • Mô-đun 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
    

Xác nhận gần nhất về lý thuyết của tôi, tôi có thể tìm thấy nó từ RFC 4253:

Định dạng khóa "ssh-rsa" có mã hóa cụ thể sau:

  string    "ssh-rsa"
  mpint     e
  mpint     n

Ở đây, các tham số 'e' và 'n' tạo thành blob khóa chữ ký.

Nhưng nó không giải thích các tiền tố chiều dài.


Lấy ngẫu nhiên RSA PUBLIC KEYtôi tìm thấy (trong câu hỏi) và giải mã base64 thành hex:

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

Từ RFC3447 - Tiêu chuẩn mã hóa khóa công khai (PKCS) # 1: Thông số kỹ thuật mã hóa RSA Phiên bản 2.1 :

A.1.1 Cú pháp khóa công khai RSA

Khóa công khai RSA phải được thể hiện bằng loại ASN.1 RSAPublicKey:

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

Các trường loại RSAPublicKey có các ý nghĩa sau:

  • mô đun là mô đun RSA n.
  • publicExponent là số mũ công khai RSA e.

Sử dụng tài liệu ASN.1 xuất sắc (và duy nhất) của Microsoft :

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

đưa ra mô-đun khóa công khai và số mũ:

  • mô đun =0xfb1199ff0733f6e805a4fd3b36ca68...837a63
  • số mũ = 65,537

Cập nhật : Hình thức mở rộng của câu trả lời này trong một câu hỏi khác


1
RSA PUBLIC KEYtheo mẫu ASN.1 (xem thông số PKCS), nó không liên quan gì đến định dạng của OpenSSH.
Bruno

3
Câu trả lời tuyệt vời - cảm ơn rất nhiều. "Số 0 đứng đầu vì bit cao nhưng số là dương" làm cho nó ở định dạng khóa ssh-rsa theo nguồn. Gợi ý hữu ích nhất về điều này tôi có thể tìm thấy là một nhận xét ở github.com/openssh/openssh-portable có nội dung "/ * Nếu MSB được đặt, hãy đặt trước \ 0 * /" khi viết bignums theo định dạng ssh-rsa. Đây chỉ là một vấn đề đối với mô đun công khai 50% (?) Thời gian và không bao giờ trong số mũ công khai do bản chất của các khóa RSA được tạo.
Tim Potter

câu trả lời tuyệt vời, về stringmpint - nó được mô tả trong RFC 4251, phần 5, không cần phải bỏ qua :)
user1516873

10

Bộ giải mã tham chiếu của CRL, CRT, CSR, CSR MỚI, PRIVATE KEY, PUBLIC KEY, RSA, RSA Public Key Parser

Khóa công khai RSA

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

Khóa riêng được mã hóa

-----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 MỚI

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

PEM

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

PKCS7

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

KHÓA RIÊNG TƯ

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

Chìa khóa DSA

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

Đường cong elip

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

Khóa riêng PGP

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

Khóa công khai PGP

-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.