मैं सार्वजनिक कुंजी प्रारूप की दो शैलियों के बीच कैसे परिवर्तित कर सकता हूं, एक "बेगिन RSA सार्वजनिक कुंजी", दूसरा "BEGIN सार्वजनिक कुंजी"


97

मैं सार्वजनिक कुंजी प्रारूप की दो शैलियों के बीच कैसे बदल सकता हूं, एक प्रारूप है:

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

अन्य प्रारूप है:

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

उदाहरण के लिए, मैंने ssh-keygen कमांड का उपयोग करके id_rsa / id_rsa.pub जोड़ी तैयार की, मैंने id_rsa से सार्वजनिक कुंजी का उपयोग करके गणना की:

openssl rsa -in id_rsa -pubout -out pub2 

तब मैंने फिर से id_rsa.pub से सार्वजनिक कुंजी की गणना की:

ssh-keygen -f id_rsa.pub -e -m pem > pub1

सामग्री पब 1 है:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

और पब 2 की सामग्री है:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----

मेरी समझ के अनुसार, पब 1 और पब 2 में एक ही सार्वजनिक महत्वपूर्ण जानकारी है, लेकिन वे अलग प्रारूप में हैं, मुझे आश्चर्य है कि मैं दो प्रारूप के बीच कैसे बदल सकता हूं? क्या कोई मुझे टो प्रारूपों पर कुछ संक्षिप्त परिचय दिखा सकता है?


स्टैक ओवरफ्लो प्रोग्रामिंग और विकास प्रश्नों के लिए एक साइट है। यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह प्रोग्रामिंग या विकास के बारे में नहीं है। देखें किन विषयों मैं यहाँ के बारे में पूछ सकते हैं सहायता केंद्र में। शायद सुपर यूजर या यूनिक्स और लिनक्स स्टैक एक्सचेंज पूछने के लिए बेहतर जगह होगी।
jww

जवाबों:


12

Phpseclib का उपयोग कर, एक शुद्ध PHP RSA कार्यान्वयन ...

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----');
$rsa->setPublicKey();

echo $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW);

Base64- एन्कोडेड सामान भले ही BEGIN PUBLIC KEY कहे, लेकिन BEGIN RSA PUBLIC KEY नहीं है, भले ही मेल खाता हो। तो शायद इसे ठीक करने के लिए str_replace का उपयोग करें और आपको जाने के लिए अच्छा होना चाहिए!


312

मैं यह समझाने में मदद करना चाहता था कि यहाँ क्या हो रहा है।

RSA "सार्वजनिक कुंजी" में दो नंबर होते हैं:

  • मापांक (उदाहरण के लिए 2,048 बिट संख्या)
  • प्रतिपादक (आमतौर पर 65,537)

एक उदाहरण के रूप में अपने आरएसए सार्वजनिक कुंजी का उपयोग करते हुए, दो नंबर हैं:

  • मापांक : 297,056,429,939,040,947,991,047,334,197,581,225,628,107,021,573,849,359,042,679,698,093,131.908, 015.712.695.688.944.173.317.630.555.849.768.647.118.986.535.684.992.447.654.339.728.777.985.990.170, 679.511.111.819.558.063.246.667.855.023.730.127.805.401.069.042.322.764.200.545.883.378.826.983.730, 553.730.138.478.384.327.116.513.143.842.816.383.440.639.376.515.039.682.874.046.227.217.032.079.079.790.098.143.158.087.443.017.552.531.393.264.852.461.292.775.129.262.080.851.633.535.934.010.704.122.673.027.067.442.627.059.982.393.297.716.922.243.940.155.855.127.430.302.323.883.824.137.412.883.916.794.359.982.603.439.112.095.116.831.297.809.626.059.569.444.750.808.699.678.211.904.501.083.183.234.323.797.142.810.155.862.553.705.570.600.021.649.944.369.726.123.996.534.870.137.000.784.980.673.984.909.570.977.377.882.585.701
  • घातांक : 65,537

प्रश्न तब बनता है कि हम इन नंबरों को कंप्यूटर में कैसे संग्रहीत करना चाहते हैं। पहले हम दोनों को हेक्साडेसिमल में बदलते हैं:

  • मापांक : EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
  • घातांक : 010001

RSA ने पहले प्रारूप का आविष्कार किया

RSA ने पहले एक प्रारूप का आविष्कार किया:

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

वे दो संख्याओं का प्रतिनिधित्व करने के लिए मानक एन्कोडिंग ASN.1 द्विआधारी की डीईआर स्वाद का उपयोग करने के लिए चुना [1] :

SEQUENCE (2 elements)
   INTEGER (2048 bit): EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
   INTEGER (24 bit): 010001

ASN.1 में अंतिम बाइनरी एन्कोडिंग है:

30 82 01 0A      ;sequence (0x10A bytes long)
   02 82 01 01   ;integer (0x101 bytes long)
      00 EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
   02 03         ;integer (3 bytes long)
      010001

यदि आप फिर उन सभी बाइट्स को एक साथ चलाते हैं और Base64 इसे एनकोड करते हैं, तो आपको यह मिलता है:

MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB

RSA लैब ने कहा कि हेडर और ट्रेलर जोड़ें:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

पाँच हाइफ़न, और शब्द BEGIN RSA PUBLIC KEY। यह आपका PEM DER ASN.1 PKCS # 1 RSA सार्वजनिक कुंजी है

  • पीईएम: बेस 64 का पर्यायवाची
  • DER: ASN.1 एन्कोडिंग का स्वाद
  • ASN.1: बाइनरी एन्कोडिंग योजना का उपयोग किया जाता है
  • PKCS # 1: औपचारिक विनिर्देश जो एक सार्वजनिक कुंजी का प्रतिनिधित्व करता है जो संरचना के रूप में होता है जिसमें एक प्रतिपादक के बाद मापांक होता है
  • RSA सार्वजनिक कुंजी: सार्वजनिक कुंजी एल्गोरिथ्म का उपयोग किया जा रहा है

सिर्फ आरएसए ही नहीं

उसके बाद, सार्वजनिक कुंजी क्रिप्टोग्राफी के अन्य रूपों के साथ आया:

  • Diffie-Hellman
  • एलिसप्टिक कर्व

जब उन एन्क्रिप्शन एल्गोरिदम के मापदंडों का प्रतिनिधित्व करने के तरीके के लिए एक मानक बनाने का समय आया , तो लोगों ने बहुत सारे समान विचारों को अपनाया जिन्हें आरएसए ने मूल रूप से परिभाषित किया था:

  • ASN.1 बाइनरी एन्कोडिंग का उपयोग करें
  • आधार 64
  • इसे पांच हाइफ़न के साथ लपेटें
  • और शब्द BEGIN PUBLIC KEY

लेकिन उपयोग करने के बजाय:

  • -----BEGIN RSA PUBLIC KEY-----
  • -----BEGIN DH PUBLIC KEY-----
  • -----BEGIN EC PUBLIC KEY-----

उन्होंने इसके बजाय ऑब्जेक्ट आइडेंटिफ़ायर (ओआईडी) का पालन करने का निर्णय लिया। RSA सार्वजनिक कुंजी के मामले में, यह है:

  • RSA PKCS # 1 :1.2.840.113549.1.1.1

तो आरएसए सार्वजनिक कुंजी के लिए यह अनिवार्य रूप से था:

public struct RSAPublicKey {
   INTEGER modulus,
   INTEGER publicExponent 
}

अब उन्होंने SubjectPublicKeyInfo बनाया जो मूल रूप से है:

public struct SubjectPublicKeyInfo {
   AlgorithmIdentifier algorithm,
   RSAPublicKey subjectPublicKey
}

वास्तविक DER ASN.1 में परिभाषा है:

SubjectPublicKeyInfo  ::=  SEQUENCE  {
    algorithm  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER, -- 1.2.840.113549.1.1.1 rsaEncryption (PKCS#1 1)
        parameters              ANY DEFINED BY algorithm OPTIONAL  },
    subjectPublicKey     BIT STRING {
        RSAPublicKey ::= SEQUENCE {
            modulus            INTEGER,    -- n
            publicExponent     INTEGER     -- e
        }
}

यह आपको ASN.1 देता है:

SEQUENCE (2 elements)
   SEQUENCE (2 elements)
      OBJECT IDENTIFIER 1.2.840.113549.1.1.1
      NULL
   BIT STRING (1 element)
      SEQUENCE (2 elements)
         INTEGER (2048 bit): EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
         INTEGER (24 bit): 010001

ASN.1 में अंतिम बाइनरी एन्कोडिंग है:

30 82 01 22          ;SEQUENCE (0x122 bytes = 290 bytes)
|  30 0D             ;SEQUENCE (0x0d bytes = 13 bytes) 
|  |  06 09          ;OBJECT IDENTIFIER (0x09 = 9 bytes)
|  |  2A 86 48 86   
|  |  F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1
|  |  05 00          ;NULL (0 bytes)
|  03 82 01 0F 00    ;BIT STRING  (0x10f = 271 bytes)
|  |  30 82 01 0A       ;SEQUENCE (0x10a = 266 bytes)
|  |  |  02 82 01 01    ;INTEGER  (0x101 = 257 bytes)
|  |  |  |  00             ;leading zero of INTEGER
|  |  |  |  EB 50 63 99 F5 C6 12 F5  A6 7A 09 C1 19 2B 92 FA 
|  |  |  |  B5 3D B2 85 20 D8 59 CE  0E F6 B7 D8 3D 40 AA 1C 
|  |  |  |  1D CE 2C 07 20 D1 5A 0F  53 15 95 CA D8 1B A5 D1 
|  |  |  |  29 F9 1C C6 76 97 19 F1  43 58 72 C4 BC D0 52 11 
|  |  |  |  50 A0 26 3B 47 00 66 48  9B 91 8B FC A0 3C E8 A0
|  |  |  |  E9 FC 2C 03 14 C4 B0 96  EA 30 71 7C 03 C2 8C A2  
|  |  |  |  9E 67 8E 63 D7 8A CA 1E  9A 63 BD B1 26 1E E7 A0  
|  |  |  |  B0 41 AB 53 74 6D 68 B5  7B 68 BE F3 7B 71 38 28
|  |  |  |  38 C9 5D A8 55 78 41 A3  CA 58 10 9F 0B 4F 77 A5
|  |  |  |  E9 29 B1 A2 5D C2 D6 81  4C 55 DC 0F 81 CD 2F 4E 
|  |  |  |  5D B9 5E E7 0C 70 6F C0  2C 4F CA 35 8E A9 A8 2D 
|  |  |  |  80 43 A4 76 11 19 55 80  F8 94 58 E3 DA B5 59 2D
|  |  |  |  EF E0 6C DE 1E 51 6A 6C  61 ED 78 C1 39 77 AE 96 
|  |  |  |  60 A9 19 2C A7 5C D7 29  67 FD 3A FA FA 1F 1A 2F 
|  |  |  |  F6 32 5A 50 64 D8 47 02  8F 1E 6B 23 29 E8 57 2F 
|  |  |  |  36 E7 08 A5 49 DD A3 55  FC 74 A3 2F DD 8D BA 65
|  |  |  02 03          ;INTEGER (03 = 3 bytes)
|  |  |  |  010001

और पहले की तरह, आप उन सभी बाइट्स को लेते हैं, Base64 उन्हें सांकेतिक शब्दों में बदलना, आप अपने दूसरे उदाहरण के साथ समाप्त करते हैं:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB   

थोड़ा अलग हेडर और ट्रेलर जोड़ें, और आपको मिलता है:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB   
-----END PUBLIC KEY-----

और यह आपकी X.509 सबजेक्टपब्लिककेयइंफो / ओपनएसएसएल पीईएम सार्वजनिक कुंजी [2] है

इसे सही करें, या इसे हैक करें

अब जब आप जानते हैं कि एन्कोडिंग जादू नहीं है, तो आप आरएसए मापांक और प्रतिपादक को पार्स करने के लिए आवश्यक सभी टुकड़े लिख सकते हैं। या आप यह पहचान सकते हैं कि पहले 24 बाइट्स मूल PKCS # 1 मानक के शीर्ष पर नया सामान जोड़ रहे हैं

30 82 01 22          ;SEQUENCE (0x122 bytes = 290 bytes)
|  30 0D             ;SEQUENCE (0x0d bytes = 13 bytes) 
|  |  06 09          ;OBJECT IDENTIFIER (0x09 = 9 bytes)
|  |  2A 86 48 86   
|  |  F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1
|  |  05 00          ;NULL (0 bytes)
|  03 82 01 0F 00    ;BIT STRING  (0x10f = 271 bytes)
|  |  ...

उन पहले 24 बाइट्स में "नया" सामान जोड़ा गया है:

30 82 01 22 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 03 82 01 0F 00

और भाग्य और सौभाग्य के एक असाधारण संयोग के कारण:

24 बाइट्स वास्तव में 32 बेस 64 एनकोडेड वर्णों के अनुरूप होते हैं

क्योंकि Base64 में: 3-बाइट्स चार वर्ण बन जाते हैं:

30 82 01  22 30 0D  06 09 2A  86 48 86  F7 0D 01  01 01 05  00 03 82  01 0F 00
\______/  \______/  \______/  \______/  \______/  \______/  \______/  \______/
    |         |         |         |         |         |         |         |
  MIIB      IjAN      Bgkq      hkiG      9w0B      AQEF      AAOC      AQ8A

इसका मतलब है कि यदि आप अपनी दूसरी X.509 सार्वजनिक कुंजी लेते हैं, तो पहले 32 अक्षर केवल नए जोड़े गए सामान से मेल खाते हैं:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END PUBLIC KEY-----

यदि आप पहले 32 वर्णों को हटाते हैं, और इसे BEGIN RSA सार्वजनिक कुंजी में बदल देते हैं :

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

आपके पास वही है जो आप चाहते थे - पुराना RSA PUBLIC KEYप्रारूप।


29
पवित्र गेंदों, कि जानकारीपूर्ण था! धन्यवाद। इसने मेरे मुद्दे को एक अजगर आदमी के साथ हल किया जो केवल BEGIN RSA सार्वजनिक कुंजी की उम्मीद कर रहा था। हालाँकि, आपके अंतिम उदाहरण में, ऐसा लगता है कि आप 32 अक्षरों को हटाना भूल गए हैं।
NullVoxPopuli

फ़ाइलों के हेक्स संरचना को प्रिंट करने के लिए आपने किस टूल का उपयोग किया?
बुग

7
@Buge मैंने उत्कृष्ट, उत्कृष्ट, ASN.1 जावास्क्रिप्ट डिकोडर का उपयोग किया । वह और ट्रांसलेटर, BINARY आपके टूल ट्रिक्स में दो उत्कृष्ट उपकरण हैं।
इयान बॉयड

1
मापांक की शुरुआत में एक अतिरिक्त "1" चरित्र है। यह इस तरह से शुरू होना चाहिए ... 297,056,429,939,040,947,991,047,334,197,581,225,628,107,02,573 ... लेकिन यह नहीं ... 297,056,429,939,040,47,991,047,334,197,581,225,628,107,021,573 ... आशा है कि आपको मदद करनी चाहिए ...
एमाथिकैज


51

मुझे यह वेबसाइट विभिन्न स्वरूपों के अच्छे तकनीकी विवरण के लिए मिली: https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem

"BEGIN RSA पब्लिक कुंजी" PKCS # 1 है, जिसमें केवल RSA कुंजियाँ हो सकती हैं।

"BEGIN PUBLIC KEY" PKCS # 8 है, जिसमें विभिन्न प्रकार के प्रारूप हो सकते हैं।

यदि आप उन्हें कमांड-लाइन के साथ बदलना चाहते हैं, तो इसके लिए "ओपनसेल आरएसए" अच्छा है।

PKCS # 8 से PKCS # 1 में बदलने के लिए:

openssl rsa -pubin -in <filename> -RSAPublicKey_out

PKCS # 1 से PKCS # 8 में परिवर्तित करने के लिए:

openssl rsa -RSAPublicKey_in -in <filename> -pubout

2
मुझे पीकेसीएस # 8 ( आरएफसी 5208 ) में सार्वजनिक कुंजी के बारे में कुछ भी नहीं मिल रहा है ।
फ्रैंकलिन यू

MacOS पर काम नहीं करता है:unknown option -RSAPublicKey_in
nakajuice

2
@FranklinYu: हाँ PKCS8 केवल निजी है और पोलरसेल उस बिंदु पर गलत है। Publickey का सामान्य रूप X.509 और विशेष रूप से SubjectPublicKeyInfo द्वारा परिभाषित किया गया है, जैसा कि इयान बॉयड के (लंबे!) उत्तर में सही ढंग से कहा गया है; यह जानकारी RFC5280 में 'बुनियादी' RSA के साथ, RFC5280 और एल्गोरिथ्म पर निर्भर अन्य RFCs में (और अधिक आसानी से) डुप्लिकेट है।
dave_thompson_085

@nakajuice: आपको OpenSSL संस्करण 1.0.0 (रिलीज़ 2010) या उच्चतर की आवश्यकता है। AIUI Apple ने OS (X) पर OpenSSL का समर्थन करना बंद कर दिया है, इसलिए आपको काढ़ा या इसके समान संस्करण की आवश्यकता हो सकती है।
dave_thompson_085

यह मुझे ओपनएसएसएच प्रारूप से परिवर्तित करने के लिए सही दिशा में मिला। मैंने ssh-keygen का उपयोग इस तरह किया: ssh-keygen -i -f ~ / .shsh / id_rsa.pub -e -m PKCS8> ~ / .ssh / id_rsa.pub.pem
ब्रैडली क्रेडर

13

जबकि 32 बाइट हेडर, OID स्वरूपों और इस तरह के दिलचस्प के बारे में उपरोक्त टिप्पणियां, मैं व्यक्तिगत रूप से एक ही व्यवहार नहीं देख रहा हूं, यह मानते हुए कि मुझे बात मिल रही है। मुझे लगा कि यह इस बात का पता लगाने में मददगार हो सकता है कि जो सबसे ज्यादा संभव है, वह है। अतिरिक्त से अधिक कुछ भी नहीं।

शुरू करने के लिए, मैंने एक आरएसए निजी कुंजी बनाई, और इसकी जाँच की:

>openssl rsa -in newclient_privatekey.pem  -check
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4pOYWo+GeAEmU4N1HPZj1dxv70
4hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyozC/zSqcuU6iBrvzDTpyG1zhIG
76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknmLBrtZkLkBhchgYnMswIDAQAB
AoGAQaJ5aivspeEXcpahWavzAFLv27+Tz48usUV+stY6arRhqbBEkV19/N5t8EPA
01U6IGDQ8QIXEIW/rtsHKM6DAZhAbakPDJhJRatcMzJ08ryIkP/c3+onkTquiveG
brw7xzn6Xa8ls04aQ6VQR4jxXUjV5bB72pFZnGRoAmS2NiECQQDUoISbmTGjnHM+
kEfunNTXbNmKklwTYhyZaSVsSptnD7CvLWB4qB/g4h2/HjsELag6Z7SlWuYr7tba
H3nBYn35AkEAykFRudMqlBy3XmcGIpjxOD+7huyViPoUpy3ui/Bj3GbqsbEAt9cR
PyOJa1VFa2JqShta1Tdep8LJv1QvgvY7CwJBAML+al5gAXvwEGhB3RXg0fi2JFLG
opZMFbpDCUTkrtu3MeuVC7HbTVDpTSpmSO0uCed2D97NG+USZgsnbnuBHdECQQCw
S3FWPXdetQ0srzaMz61rLzphaDULuZhpBMNqnTYeNmMaUcPjewagd3Rf52rkKFun
juKE+Yd7SXGbYWEskT5zAkAD7tbNwe5ryD2CT71jrY/5uXMR2yg/A4Ry2ocZkQUp
iGflLrHnODvHO5LYLBlSKpjanBceYHJLuMFNZruf7uBM
-----END RSA PRIVATE KEY-----

(ओह, भयावह! मैंने एक निजी कुंजी उजागर की है। मेह ...)

मैं इसकी सार्वजनिक कुंजी निकालता हूं और प्रदर्शित करता हूं:

>openssl rsa -in newclient_privatekey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

ऐसा होता है कि एक और सार्वजनिक कुंजी आउटपुट पैरामीटर है (जैसा कि पहले टिप्पणी में उल्लेख किया गया है)। मैं उस कुंजीशब्द के बजाय सार्वजनिक कुंजी को निकालता और प्रदर्शित करता हूं:

>openssl rsa -in newclient_privatekey.pem -RSAPublicKey_out
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----

अच्छा अच्छा। ये दो सार्वजनिक कुंजी मूल्य समान नहीं हैं, हालांकि वे एक ही निजी कुंजी से प्राप्त किए गए हैं। या वे एक ही हैं? मैं दो सार्वजनिक कुंजी को अपनी फ़ाइलों में काटता और चिपकाता हूं, और फिर प्रत्येक पर एक मापांक जांचता हूं:

>openssl rsa -in newclient_publickey.pem -pubin -modulus
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

'पबिन' आरएएस को बताता है कि यह वास्तव में एक सार्वजनिक कुंजी माना जाता है, और यह शिकायत न करें कि यह एक निजी कुंजी नहीं है।

अब हम RSA सार्वजनिक कुंजी लेते हैं, मापांक प्रदर्शित करते हैं, और इसे एक पुरानी पुरानी 'सार्वजनिक कुंजी' में परिवर्तित करते हैं (फिर, हमें यह बताना होगा कि इनपुट एक सार्वजनिक कुंजी है):

>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

समान मापांक, और समान 'सार्वजनिक कुंजी' मूल्य प्रदर्शित किया गया। चीजों को और अधिक रोचक बनाने के लिए (वैसे भी मेरे लिए), जब हम RSAPublicKey_out कीवर्ड से निपटते हैं , तो हम प्राप्त करते हैं:

>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus -RSAPublicKey_out
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----

... और जब हम एक आरएसए सार्वजनिक कुंजी में सादे पुरानी 'सार्वजनिक कुंजी' को प्रसारित करते हैं:

>openssl rsa -in newclient_publickey.pem -pubin -RSAPublicKey_out
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----

... अथक रूप से मार्च कर रहे हैं, और हालांकि हमने अभी कुछ समय पहले यह किया था, इस बिंदु को बनाने के लिए हम आरएसए से सादे पुरानी 'सार्वजनिक कुंजी' के लिए चीजों को फ्लिप करते हैं:

>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----

... जो हमें वापस वहीं ले जाता है जहाँ हमने शुरू किया था। हमने क्या सीखा है?

सारांश: कुंजी आंतरिक रूप से समान हैं, वे बस अलग दिखते हैं। एक पूर्व टिप्पणी ने बताया कि RSA कुंजी प्रारूप PKCS # 1 में परिभाषित किया गया था, और सादे पुराने 'सार्वजनिक कुंजी' प्रारूप PKCS # 8 में परिभाषित किया गया था। हालाँकि, एक फ़ॉर्म को संपादित करने से यह दूसरे में नहीं बदल जाता है। उम्मीद है कि अब मैं इस अंतर को मार दूंगा।

मामले में अभी भी जीवन की एक चिंगारी बाकी है, हालांकि, इसे थोड़ा और बढ़ाएं और प्रमाण पत्र का संदर्भ दें जो मूल रूप से आरएसए निजी कुंजी के साथ उत्पन्न हुआ था, इसकी सार्वजनिक कुंजी और मापांक की जांच:

>openssl x509 -in newclient_cert.pem -pubkey -noout -modulus
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3

... और वे सभी कभी खुशी से रहते थे: प्रमाण पत्र में आरएसए सार्वजनिक कुंजी, आरएसए निजी कुंजी और सादे पुरानी 'सार्वजनिक कुंजी' के समान मापांक मूल्य होता है। प्रमाण पत्र में वही सादा पुरानी 'सार्वजनिक कुंजी' मूल्य होता है जिसे हमने पहले देखा था, हालांकि यह एक आरएसए निजी कुंजी के रूप में चिह्नित फ़ाइल के साथ हस्ताक्षरित था। यह कहना सुरक्षित है कि आम सहमति है।

OpenSSL आकाशगंगा के X509 चतुर्थांश में कोई 'RSAPublicKey_out' समतुल्य कीवर्ड नहीं है, इसलिए हम यह कोशिश नहीं कर सकते हैं, हालांकि मापांक मान को "RSA कुंजी मापांक" के रूप में वर्णित किया गया है, जो मुझे लगता है कि हम करीब हैं जैसा कि हम प्राप्त करेंगे।

यह सब एक डीएसए-हस्ताक्षरित प्रमाण पत्र के साथ कैसे दिखेगा, मुझे नहीं पता।

मुझे लगता है कि यह मूल प्रश्न का उत्तर नहीं देता है, लेकिन शायद यह कुछ उपयोगी पृष्ठभूमि प्रदान करता है। यदि नहीं, तो मेरी माफ़ी। बहुत कम से कम, नहीं करने के लिए चीजें और बनाने के लिए मान्यताओं।

इसमें कोई शक नहीं है कि "आरएसए कुंजी लेखन" की थोड़ी चिड़चिड़ाहट दोहराई गई है, जब यह ऐसा कोई काम नहीं कर रहा है। मुझे लगता है कि इसका क्या मतलब है कि आरएसए मॉड्यूल सादे पुरानी सार्वजनिक कुंजी को एक सच्चे आरएसए कुंजी के रूप में पहचानता है, और इसीलिए यह "आरएसए कुंजी" को नुकसान पहुंचाता रहता है (प्लस यह आरएसए मॉड्यूल है, सब के बाद)। यदि मुझे ठीक से याद है, तो सामान्य ईवीपी_पीकेवाई संरचना में सभी प्रमुख प्रकारों के लिए एक संघ है, जिसमें प्रत्येक कुंजी प्रकार का अपना विशेष मान है (सहायक रूप से नामित जी, डब्ल्यू, क्यू, और अन्य व्यंजन)।

अंत में, मैं ध्यान देता हूं कि प्रोग्रामिंग और विकास से संबंधित एक शिकायत थी; अब, प्रत्येक ओपनएसएसएल कमांड में स्पष्ट रूप से संबंधित कोड होता है, और यदि कोई व्यक्ति उन सभी आश्चर्यों का पता लगाना चाहता है जो आज ओपनएसएसएल प्रोग्रामिंग है, तो कमांड लाइन शुरू करने के लिए एक उचित स्थान होगा। इस विशेष मामले में (जैसा कि मैं इस समय एक हालिया सागविन का उपयोग कर रहा हूं) कोई व्यक्ति \ opensl-1.0.2f \ apps \ rsa.c की समीक्षा करके शुरू कर सकता है (और किसी के पास मैक्रो के लिए उच्च सहिष्णुता है) \ opensl-1.0। 2f \ क्रिप्टो \ पीईएम \ pem_all.c


8

अपने पब 1 और पब 2 के बीच एकमात्र अंतर, हेडर / फुटर के अलावा, पब 2 में यह अतिरिक्त स्ट्रिंग है: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A । यदि आप इसे हटाते हैं, तो बेस 64 पब 1 के समान है।

अतिरिक्त स्ट्रिंग इस उत्तर के अनुसार एल्गोरिथ्म पहचानकर्ता से मेल खाती है ।

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