RSA सार्वजनिक कुंजी प्रारूप


139

आरएसए सार्वजनिक कुंजी के प्रारूप पर मुझे कुछ दस्तावेज कहां मिल सकते हैं?

एक आरएसए सार्वजनिक कुंजी द्वारा स्वरूपित OpenSSH:

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

उसी सार्वजनिक कुंजी को सुरक्षित शेल (RFC 4716 - सुरक्षित शेल (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 ----

उसी सार्वजनिक कुंजी को 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-----

बेस -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

मैंने पढ़ा है कि कुछ प्रारूप हैं there :

मुख्य डेटा को तीन सामान्य तरीकों से एन्कोड किया जा सकता है:

  • बाइनरी डीईआर-एन्कोडेड प्रारूप। इसे कभी-कभी ASN.1 BER- एनकोडेड भी कहा जाता है
  • पीईएम या बेस 64 प्रारूप। यह DER- एन्कोडेड फ़ाइल के समान डेटा है लेकिन यह अतिरिक्त शीर्षलेख और पाद लेख लाइनों के साथ base64 में इनकोड किया गया है
  • XML प्रारूप।

यदि यह ASN.1 है , तो हेक्स निश्चित रूप से ऐसा नहीं दिखता है।

RSA सार्वजनिक कुंजी का प्रारूप क्या है?


यह सभी देखें

जवाबों:


68

आप न सिर्फ से सीमांकक बदल सकते हैं ---- BEGIN SSH2 PUBLIC KEY ----करने के लिए -----BEGIN RSA PUBLIC KEY-----और उम्मीद करते हैं कि यह एक प्रारूप से दूसरे में बदलने के लिए (है जो आप अपने उदाहरण में किया है) पर्याप्त होगा।

इस लेख में दोनों प्रारूपों के बारे में अच्छी व्याख्या है।

आपको जो मिलता है वह एक RSA PUBLIC KEYकी सामग्री के करीब है PUBLIC KEY, लेकिन आपको इस तथ्य को प्रतिबिंबित करने के लिए अपने ASN.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। पहले चार बाइट्स ( 00 00 00 07) आपको लंबाई देते हैं। बाकी स्वयं स्ट्रिंग है: 73 = एस, 68 = एच, ... -> 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) ट्रांसपोर्ट लेयर प्रोटोकॉल - खंड 6.6 में पूरी तरह से प्रलेखित है सार्वजनिक कुंजी एल्गोरिदम ; इसके अलावा मुझे वहां कोई दस्तावेज नहीं मिल सकता है। मैंने पाया कि किसी के सार्वजनिक RSA कुंजी का उपयोग करने के लिए प्रश्न को अपडेट किया गया है।
इयान बॉयड

मेरा मानना ​​है कि पहला लिंक 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 कुंजी के डिकोड किए गए आधार 64 डेटा से शुरू , मैं एक प्रारूप का अनुमान लगाने में सक्षम रहा हूं :

  • 00 00 00 07: चार बाइट लंबाई उपसर्ग (7 बाइट्स)
  • 73 73 68 2d 72 73 61: "ssh-rsa"
  • 00 00 00 01: चार बाइट लंबाई उपसर्ग (1 बाइट)
  • 25: आरएसए एक्सपोनेंट ( e): 25
  • 00 00 01 00: चार बाइट लंबाई उपसर्ग (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

यहाँ 'ई' और 'एन' पैरामीटर हस्ताक्षर कुंजी बूँद बनाते हैं।

लेकिन यह लंबाई उपसर्गों की व्याख्या नहीं करता है।


रैंडम लेना RSA PUBLIC KEY i (प्रश्न में) मिला, और बेस 64 को हेक्स में डिकोड करना:

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: आरएसए क्रिप्टोग्राफी विनिर्देशों संस्करण 2.1 :

A.1.1 RSA सार्वजनिक कुंजी सिंटैक्स

RSA सार्वजनिक कुंजी को ASN.1 प्रकार के साथ दर्शाया जाना चाहिए RSAPublicKey :

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

RSAPublicKey प्रकार के क्षेत्र निम्नलिखित अर्थ रखते हैं:

  • modulus 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 के प्रारूप से कोई लेना-देना नहीं है।
ब्रूनो

3
शानदार जवाब - बहुत बहुत धन्यवाद। "अग्रणी शून्य क्योंकि उच्च-बिट लेकिन संख्या सकारात्मक है" यह स्रोत के अनुसार ssh-rsa कुंजी प्रारूप में बनाता है। इसके बारे में सबसे उपयोगी संकेत मैं पा सकता हूं github.com/openssh/openssh-portable में एक टिप्पणी है जो कहती है "/ * यदि MSB सेट है, तो ssh-rsa प्रारूप में bignums लिखते समय a \ 0 * /" prepend करें। यह केवल सार्वजनिक मापांक 50% (?) के लिए एक समस्या प्रतीत होता है और कभी भी सार्वजनिक आरएसए में उत्पन्न आरएसए कुंजियों की प्रकृति के कारण नहीं होता है।
टिम पॉटर

महान जवाब, के बारे में stringऔर mpint - यह आरएफसी 4251, धारा 5 में वर्णित है,
छोड़ने

10

का संदर्भ डिकोडर CRL, CRT, CSR, NEW CSR, निजी कुंजी, सार्वजनिक कुंजी, RSA, RSA सार्वजनिक कुंजी पार्सर

RSA सार्वजनिक कुंजी

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

एन्क्रिप्टेड निजी कुंजी

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

सीआरएल

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

सीआरटी

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

सीएसआर

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

नई सीएसआर

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

पीईएम

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

पीजीपी पब्लिक की

-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.