RSA Ortak Anahtar biçimi


139

RSA genel anahtarının biçimiyle ilgili bazı belgeleri nerede bulabilirim?

Bir RSA açık anahtar ile biçimlendirilmiş OpenSSH:

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

Güvenli Kabuk'ta kullanılmak üzere biçimlendirilmiş aynı genel anahtar (RFC 4716 - Güvenli Kabuk (SSH) Genel Anahtar Dosya Biçimi) :

---- 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 genel anahtarı olarak biçimlendirilmiş aynı ortak anahtar ( beş nota dikkat edin -ve boşluk yok):

-----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 kodlanmış verilerin onaltılık dökümü:

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

Ben birkaç biçim read olduğunu okudum :

Temel veriler üç genel yolla kodlanabilir:

  • İkili DER kodlu biçim. Buna bazen ASN.1 BER kodlu denir
  • PEM veya base64 biçimi. Bu, DER kodlu dosya ile aynı verilerdir ancak base64 içinde ek üstbilgi ve altbilgi satırlarıyla kodlanmıştır
  • XML biçimi.

Eğer ASN.1 ise, hex kesinlikle böyle görünmüyor.

RSA genel anahtarının biçimi nedir?


Ayrıca bakınız

Yanıtlar:


68

Sınırlayıcıları olarak ---- BEGIN SSH2 PUBLIC KEY ----değiştirebilir -----BEGIN RSA PUBLIC KEY-----ve bir biçimden diğerine dönüştürmenin yeterli olacağını bekleyemezsiniz (bu, örneğinizde yaptığınız şeydir).

Bu makalede , her iki biçim hakkında iyi bir açıklama vardır.

Bir elde RSA PUBLIC KEYedeceğiniz şey, a'nın içeriğine daha yakındır PUBLIC KEY, ancak ASN.1 yapınızın başlangıcını, PUBLIC KEYhangi tür anahtar olduğunu söyleyen bir göstergeye sahip olduğu gerçeğini yansıtmak için dengelemeniz gerekir (bkz. RFC 3447 ). Bunu, bu cevapta açıklandığı gibi openssl asn1parseve ile görebilirsiniz .-strparse 19

DÜZENLEME : Düzenlemenizi takiben, RSA PUBLIC KEYyapınızın ayrıntılarını kullanarak şunları alabilirsiniz 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 anahtar biçimini deşifre etmek için, veri formatı belirtimi kullanmak gerekir RFC 4251 , RFC 4253 ile birlikte, çok:

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

      string    "ssh-rsa"
      mpint     e
      mpint     n

Örneğin, başlangıçta, alırsınız 00 00 00 07 73 73 68 2d 72 73 61. İlk dört bayt ( 00 00 00 07) size uzunluğu verir. Gerisi dizenin kendisidir: 73 = s, 68 = h, ... -> 73 73 68 2d 72 73 61= ssh-rsa, ardından uzunluk 1 ( 00 00 00 01 25) üssü ve uzunluk 256 ( 00 00 01 00 7f ...) modülü .


2
O makale OpenSSH biçimi bahseder olan bir biçim ama formatının detaya almaz. Bunun yerine, biçimin RFC 4253 - Güvenli Kabuk (SSH) Aktarım Katmanı Protokolü - Bölüm 6.6'da tam olarak belgelendiğinden bahseder . Açık Anahtar Algoritmaları ; dışında orada herhangi bir belge bulamıyorum. bulduğum birinin ortak RSA anahtarını kullanmak için soruyu güncelledim.
Ian Boyd


Sen kullanabilirsiniz openssl asn1parse -inform PEMile -----BEGIN RSA PUBLIC KEY----veri veya başka bir PEM yapısı. Grep / tr / base64 komutlarıyla başlıkları elle işlemeye çalışmaktan çok daha kolay.
davenpcj

55

Bir OpenSSL rsa-ssh Anahtarının kod çözülmüş base64 verilerinden başlayarak, bir formatı tahmin edebildim :

  • 00 00 00 07: dört bayt uzunluklu önek (7 bayt)
  • 73 73 68 2d 72 73 61: "ssh-rsa"
  • 00 00 00 01: dört bayt uzunluklu önek (1 bayt)
  • 25: RSA Üssü ( e): 25
  • 00 00 01 00: dört bayt uzunluklu önek (256 bayt)
  • RSA Modülü ( 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
    

Teorimin en yakın doğrulaması bunu RFC 4253'ten bulabilirim:

"Ssh-rsa" anahtar biçimi aşağıdaki özel kodlamaya sahiptir:

  string    "ssh-rsa"
  mpint     e
  mpint     n

Burada 'e' ve 'n' parametreleri imza anahtar blobunu oluşturur.

Ancak uzunluk öneklerini açıklamaz.


Buldum rastgele RSA PUBLIC KEY(soruda) alarak ve base64 hex içine çözme:

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

Gönderen RFC3447 - Kamu-Anahtar Şifreleme Standartları (PKCS) # 1: RSA Şifreleme Özellikler Sürüm 2.1 :

A.1.1 RSA genel anahtar sözdizimi

Bir RSA ortak anahtarı ASN.1 türüyle temsil edilmelidir RSAPublicKey:

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

RSAPublicKey türündeki alanların anlamları:

  • modülü RSA modülü n'dir.
  • publicExponent, RSA genel üssü e'dir.

Microsoft'un mükemmel (ve tek gerçek) ASN.1 belgelerini kullanma :

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çık anahtar modülü ve üssünün verilmesi:

  • modül =0xfb1199ff0733f6e805a4fd3b36ca68...837a63
  • üs = 65.537

Güncelleme : Başka bir soruda bu cevabın genişletilmiş formum


1
RSA PUBLIC KEYASN.1 formunu izler (bkz. PKCS spesifikasyonu), OpenSSH'nin formatıyla hiçbir ilgisi yoktur.
Bruno

3
Harika cevap - çok teşekkürler. "Başlıca sıfır, çünkü yüksek bit ancak sayı pozitif", kaynağa göre ssh-rsa anahtar biçimine dönüştürür. Bulabildiğim en yararlı ipucu, github.com/openssh/openssh-portable dilinde "/ * MSB ayarlanmışsa, ssh-rsa biçiminde bignumlar yazarken bir \ 0 * /" yazan bir yorumdur. Bu sadece zamanın% 50'si (?) Genel modülü için bir sorun gibi görünmektedir ve üretilen RSA anahtarlarının doğası nedeniyle hiçbir zaman genel üssünde yoktur.
Tim Potter

büyük cevap, hakkında stringve mpint - RFC 4251, bölüm 5, tahmin etmeye gerek yok :)
user1516873

10

CRL, CRT, CSR, YENİ CSR, ÖZEL ANAHTAR, KAMU ANAHTARI, RSA, RSA Ortak Anahtar Ayrıştırıcısının Referans Kod Çözücüsü

RSA Genel Anahtarı

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

Şifreli Özel Anahtar

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

YENİ CSR

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

PEM

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

PKCS7

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

ÖZEL ANAHTAR

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

DSA ANAHTARI

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

Eliptik Eğri

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

PGP Özel Anahtarı

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

PGP Genel Anahtarı

-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.