it-swarm.com.de

RSA Public Key-Format

Wo finde ich Dokumentation zum Format eines öffentlichen RSA-Schlüssels?

Ein mit OpenSSH formatierter öffentlicher RSA-Schlüssel:

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

Derselbe öffentliche Schlüssel, der für die Verwendung in Secure Shell formatiert ist (RFC 4716 - Das Dateiformat für öffentliche Schlüssel von 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 ----

Derselbe öffentliche Schlüssel, der als öffentlicher RSA-Schlüssel formatiert ist (beachten Sie die fünf- und kein Leerzeichen):

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

Der hexadezimale Speicherauszug der Base-64-codierten Daten:

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

ich habe gelesen, dass es ein paar Formate gibt????:

Schlüsseldaten können auf drei allgemeine Arten codiert werden:

  • Binäres DER-codiertes Format. Dies wird manchmal als ASN.1 BER-codiert bezeichnet
  • PEM- oder base64-Format. Dies sind die gleichen Daten wie die DER-codierte Datei, sie werden jedoch in base64 mit zusätzlichen Kopf- und Fußzeilen codiert
  • XML-Format.

Wenn es ASN.1 ist, sieht das Hex mit Sicherheit nicht so aus.

Was ist das Format eines öffentlichen RSA-Schlüssels?


Siehe auch

128
Ian Boyd

Sie können nicht einfach die Trennzeichen von ---- BEGIN SSH2 PUBLIC KEY ---- bis -----BEGIN RSA PUBLIC KEY----- und erwarte, dass es ausreichen wird, von einem Format in ein anderes zu konvertieren (was du in deinem Beispiel getan hast).

Dieser Artikel hat eine gute Erklärung für beide Formate.

Was bekommen Sie in einem RSA PUBLIC KEY ist näher am Inhalt eines PUBLIC KEY, aber Sie müssen den Anfang Ihrer ASN.1-Struktur verschieben, um die Tatsache widerzuspiegeln, dass PUBLIC KEY hat auch einen Indikator, der angibt, um welchen Schlüsseltyp es sich handelt (siehe RFC 3447 ). Sie können dies mit openssl asn1parse und -strparse 19, wie in diese Antwort beschrieben.

[~ # ~] edit [~ # ~] : Nach Ihrer Bearbeitung können Sie die Details Ihres RSA PUBLIC KEY Struktur mit 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

Um das SSH-Schlüsselformat zu dekodieren, müssen Sie die Datenformatspezifikation in RFC 4251 auch in Verbindung mit RFC 4253 verwenden:

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

      string    "ssh-rsa"
      mpint     e
      mpint     n

Beispielsweise erhalten Sie am Anfang 00 00 00 07 73 73 68 2d 72 73 61. Die ersten vier Bytes (00 00 00 07) gib dir die Länge. Der Rest ist der String selbst: 73 = s, 68 = h, ... -> 73 73 68 2d 72 73 61 = ssh-rsa, gefolgt vom Exponenten der Länge 1 (00 00 00 01 25) und der Längenmodul 256 (00 00 01 00 7f ...).

64
Bruno

Ausgehend von den decodierten base64-Daten eines OpenSSL-rsa-ssh-Schlüssels konnte ich rate ein Format erstellen :

  • 00 00 00 07: Präfix mit vier Bytes Länge (7 Bytes)
  • 73 73 68 2d 72 73 61: "ssh-rsa"
  • 00 00 00 01: Präfix mit vier Byte Länge (1 Byte)
  • 25: RSA-Exponent (e): 25
  • 00 00 01 00: Präfix mit vier Bytes Länge (256 Bytes)
  • RSA-Modul (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
    

Die naheliegendste Bestätigung meiner Theorie findet sich in RFC 4253:

Das Schlüsselformat "ssh-rsa" weist die folgende spezifische Codierung auf:

  string    "ssh-rsa"
  mpint     e
  mpint     n

Hier bilden die Parameter 'e' und 'n' den Signaturschlüssel-Blob.

Aber es erklärt nicht die Längenpräfixe.


Das Zufällige nehmen RSA PUBLIC KEY fand ich (in der Frage) und decodierte das base64 in 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

Von RFC3447 - Public-Key-Kryptografiestandards (PKCS) # 1: RSA-Kryptografiespezifikationen Version 2.1 :

A.1.1 Syntax des öffentlichen RSA-Schlüssels

Ein öffentlicher RSA-Schlüssel sollte mit dem ASN.1-Typ RSAPublicKey dargestellt werden:

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

Die Felder vom Typ RSAPublicKey haben folgende Bedeutung:

  • modul ist der RSA-Modul n.
  • publicExponent ist der öffentliche RSA-Exponent e.

nter Verwendung der hervorragenden (und einzigen echten) ASN.1-Dokumentation von 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

angabe des Moduls und des Exponenten des öffentlichen Schlüssels:

  • Modul = 0xfb1199ff0733f6e805a4fd3b36ca68...837a63
  • Exponent = 65.537

Update : Mein erweiterte Form dieser Antwort in einer anderen Frage

52
Ian Boyd

Referenzdecoder von CRL, CRT, CSR, NEUE CSR, PRIVATER SCHLÜSSEL, ÖFFENTLICHER SCHLÜSSEL, RSA, RSA-Parser für öffentliche Schlüssel

Öffentlicher RSA-Schlüssel

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

Verschlüsselter privater Schlüssel

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

NEUE CSR

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

PEM

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

PKCS7

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

PRIVAT SCHLÜSSEL

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

DSA-SCHLÜSSEL

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

Elliptische Kurve

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

PGP Private Key

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

Öffentlicher PGP-Schlüssel

-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----
4
anish