Bagaimana cara saya mengubah antara dua gaya format kunci publik, yang satu “MULAI RSA PUBLIC KEY”, yang lainnya adalah “BEGIN PUBLIC KEY”

99

Bagaimana saya bisa mengubah antara dua gaya format kunci publik, salah satu formatnya adalah:

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

format lainnya adalah:

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

misalnya saya membuat pasangan id_rsa / id_rsa.pub menggunakan perintah ssh-keygen, saya menghitung kunci publik dari id_rsa menggunakan:

openssl rsa -in id_rsa -pubout -out pub2 

sekali lagi saya menghitung kunci publik dari id_rsa.pub menggunakan:

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

isinya pub1 adalah:

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

dan konten pub2 adalah:

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

Menurut pemahaman saya, pub1 dan pub2 berisi informasi kunci publik yang sama, tetapi memiliki format yang berbeda, saya bertanya-tanya bagaimana cara mengubah antara kedua format tersebut? Adakah yang bisa menunjukkan kepada saya beberapa pengantar singkat tentang format derek?

welkinwalker
sumber
Stack Overflow adalah situs untuk pertanyaan pemrograman dan pengembangan. Pertanyaan ini tampaknya di luar topik karena ini bukan tentang pemrograman atau pengembangan. Lihat Topik apa yang dapat saya tanyakan di sini di Pusat Bantuan. Mungkin Super User atau Unix & Linux Stack Exchange akan menjadi tempat yang lebih baik untuk bertanya.
jww

Jawaban:

12

Menggunakan phpseclib, implementasi PHP RSA murni ...

<?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);

Hal-hal yang dikodekan base64 tampaknya cocok meskipun pada header tertulis MULAI KUNCI PUBLIK dan bukan MULAI KUNCI PUBLIK RSA. Jadi mungkin gunakan saja str_replace untuk memperbaikinya dan Anda sebaiknya pergi!


sumber
314

Saya ingin membantu menjelaskan apa yang terjadi di sini.

"Kunci Publik" RSA terdiri dari dua angka:

  • modulus (misalnya, angka 2.048 bit)
  • eksponen (biasanya 65.537)

Menggunakan kunci publik RSA Anda sebagai contoh, kedua angka tersebut adalah:

  • Modulus : 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
  • Eksponen : 65.537

Pertanyaannya kemudian menjadi bagaimana kita ingin menyimpan angka-angka ini di komputer. Pertama kami mengonversi keduanya menjadi heksadesimal:

  • Modulus : EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65
  • Eksponen : 010001

RSA menemukan format pertama

RSA menemukan format terlebih dahulu:

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

Mereka memilih untuk menggunakan ragam DER dari standar pengkodean biner ASN.1 untuk mewakili dua angka [1] :

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

Pengkodean biner terakhir di ASN.1 adalah:

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

Jika Anda kemudian menjalankan semua byte itu bersama-sama dan menyandikannya Base64, Anda mendapatkan:

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

Lab RSA kemudian berkata tambahkan header dan trailer:

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

Lima tanda hubung, dan kata-kata BEGIN RSA PUBLIC KEY. Itu adalah kunci Publik PEM DER ASN.1 PKCS # 1 RSA Anda

  • PEM: sinonim untuk base64
  • DER: rasa pengkodean ASN.1
  • ASN.1: skema pengkodean biner yang digunakan
  • PKCS # 1: Spesifikasi formal yang menentukan representasi kunci publik sebagai struktur yang terdiri dari modulus diikuti oleh eksponen
  • Kunci publik RSA: algoritma kunci publik yang digunakan

Bukan hanya RSA

Setelah itu, bentuk kriptografi kunci publik lainnya muncul:

  • Diffie-Hellman
  • Kurva Ellicptic

Ketika tiba saatnya untuk menciptakan sebuah standar untuk bagaimana untuk mewakili parameter yang algoritma enkripsi, orang mengadopsi banyak ide-ide yang sama yang RSA awalnya didefinisikan:

  • gunakan pengkodean biner ASN.1
  • base64 itu
  • bungkus dengan lima tanda hubung
  • dan kata-katanya BEGIN PUBLIC KEY

Tapi daripada menggunakan:

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

Mereka memutuskan untuk memasukkan Object Identifier (OID) dari apa yang akan diikuti. Dalam kasus kunci publik RSA, yaitu:

  • RSA PKCS # 1 :1.2.840.113549.1.1.1

Jadi untuk kunci publik RSA itu pada dasarnya:

public struct RSAPublicKey {
   INTEGER modulus,
   INTEGER publicExponent 
}

Sekarang mereka membuat SubjectPublicKeyInfo yang pada dasarnya:

public struct SubjectPublicKeyInfo {
   AlgorithmIdentifier algorithm,
   RSAPublicKey subjectPublicKey
}

Dalam definisi DER ASN.1 sebenarnya adalah:

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

Itu memberi Anda ASN.1 dari:

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

Pengkodean biner terakhir di ASN.1 adalah:

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

Dan seperti sebelumnya, Anda mengambil semua byte itu, menyandikannya Base64, Anda berakhir dengan contoh kedua:

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

Tambahkan tajuk dan cuplikan yang sedikit berbeda, dan Anda mendapatkan:

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

Dan ini adalah kunci publik X.509 SubjectPublicKeyInfo / OpenSSL PEM [2] Anda .

Lakukan dengan benar, atau retas

Sekarang setelah Anda mengetahui bahwa pengkodean bukanlah sihir, Anda dapat menulis semua bagian yang diperlukan untuk mengurai modulus dan eksponen RSA. Atau Anda dapat mengenali bahwa 24 byte pertama baru saja menambahkan hal baru di atas standar PKCS # 1 asli

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 byte pertama itu adalah hal "baru" yang ditambahkan:

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

Dan karena kebetulan keberuntungan dan keberuntungan yang luar biasa:

24 byte kebetulan sama persis dengan 32 karakter yang dikodekan base64

Karena di Base64: 3-byte menjadi empat karakter:

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

Itu berarti jika Anda mengambil kunci publik X.509 kedua, 32 karakter pertama hanya sesuai dengan hal yang baru ditambahkan:

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

Jika Anda menghapus 32 karakter pertama, dan mengubahnya menjadi BEGIN RSA PUBLIC KEY :

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

Anda memiliki apa yang Anda inginkan - RSA PUBLIC KEYformat lama .

Ian Boyd
sumber
29
Sialan, itu informatif! Terima kasih. Ini memecahkan masalah saya dengan pria python yang hanya mengharapkan MULAI KUNCI PUBLIK RSA. Padahal, dalam contoh terakhir Anda, sepertinya Anda lupa menghapus 32 karakter.
NullVoxPopuli
Alat apa yang Anda gunakan untuk mencetak struktur hex dari file?
Buge
7
@Buge Saya menggunakan decoder JavaScript ASN.1 yang sangat baik, luar biasa ,. Itu dan TRANSLATOR, BINER adalah dua alat yang sangat baik untuk dimiliki di kotak peralatan trik Anda.
Ian Boyd
1
Awal modulus memiliki karakter tambahan "1". Seharusnya dimulai seperti ini ... 297.056.429.939.040.947.991.047.334.197.581.225.628.107.02.573 ... tapi BUKAN ini ... 297.056.429.939.040.947.991.047.334.197.581.225.628.107.021.573 ... harapan yang membantu seseorang agar tidak marah pada konversi hex mereka.
EmpathicSage
2
Versi jsFiddle ASN.1 js . Ini juga ada di github
Ian Boyd
52

Saya menemukan situs web ini sebagai penjelasan teknis yang baik dari berbagai format: https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem

"BEGIN RSA PUBLIC KEY" adalah PKCS # 1, yang hanya dapat berisi kunci RSA.

"BEGIN PUBLIC KEY" adalah PKCS # 8, yang dapat berisi berbagai format.

Jika Anda hanya ingin mengubahnya dengan baris perintah, "openssl rsa" bagus untuk ini.

Untuk mengkonversi dari PKCS # 8 ke PKCS # 1:

openssl rsa -pubin -in <filename> -RSAPublicKey_out

Untuk mengubah dari PKCS # 1 ke PKCS # 8:

openssl rsa -RSAPublicKey_in -in <filename> -pubout
Esme Povirk
sumber
2
Saya tidak dapat menemukan apa pun tentang kunci publik di PKCS # 8 ( RFC 5208 ).
Franklin Yu
Tidak berfungsi di MacOS: unknown option -RSAPublicKey_in
nakajuice
2
@FranklinYu: ya PKCS8 adalah privatekey saja dan polarssl salah dalam hal itu. Bentuk generik dari publickey didefinisikan oleh X.509 dan secara khusus tipe SubjectPublicKeyInfo, sebagaimana dinyatakan dengan benar dalam jawaban Ian Boyd (panjang!); info ini (lebih mudah) digandakan dalam RFC5280 ditambah RFC lain tergantung pada algoritma, dengan RSA 'dasar' di RFC3279.
dave_thompson_085
@nakajuice: Anda memerlukan OpenSSL versi 1.0.0 (dirilis 2010) atau lebih tinggi. AIUI Apple berhenti mendukung OpenSSL di OS (X), jadi Anda mungkin memerlukan versi dari brew atau serupa.
dave_thompson_085
Ini membawa saya ke arah yang benar untuk mengonversi dari format OpenSSH. Saya akhirnya menggunakan ssh-keygen seperti ini: ssh-keygen -i -f ~ / .ssh / id_rsa.pub -e -m PKCS8> ~ / .ssh / id_rsa.pub.pem
Bradley Kreider
13

Sementara komentar di atas mengenai header 32 byte, format OID dan semacamnya menarik, saya pribadi tidak melihat perilaku yang sama, dengan asumsi saya mengerti maksudnya. Saya pikir mungkin akan membantu untuk mengeksplorasi ini lebih jauh dalam apa yang menurut kebanyakan orang adalah detail yang berlebihan. Tidak ada yang melebihi kelebihan.

Untuk memulai, saya membuat kunci pribadi RSA, dan memeriksanya:

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

(Oh, kengerian! Saya telah mengungkap kunci pribadi. Meh ...)

Saya mengekstrak dan menampilkan kunci publiknya:

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

Kebetulan ada parameter keluaran kunci publik lain (seperti yang disebutkan dalam komentar sebelumnya). Saya mengekstrak dan menampilkan kunci publik menggunakan kata kunci itu sebagai gantinya:

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

Baiklah. Kedua nilai kunci publik ini tidak sama, meskipun berasal dari kunci pribadi yang sama. Atau apakah mereka sama? Saya memotong dan menempelkan dua string kunci publik ke dalam file mereka sendiri, dan kemudian melakukan pemeriksaan modulus pada masing-masing:

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

The 'pubin' mengatakan rsa bahwa ini benar-benar adalah seharusnya menjadi kunci publik, dan tidak mengeluh bahwa itu bukan kunci pribadi.

Sekarang kita mengambil kunci publik RSA, menampilkan modulus, dan mengubahnya menjadi 'kunci publik' biasa (sekali lagi, kita harus memberitahunya bahwa inputnya adalah kunci publik):

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

Modulus yang sama, dan nilai 'kunci publik' yang sama ditampilkan. Untuk membuat hal-hal lebih menarik (bagi saya, bagaimanapun), saat kita menggunakan RSAPublicKey_out kata kunci kita mendapatkan:

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

... dan ketika kami mentransmisikan 'kunci publik' lama yang biasa menjadi kunci publik RSA:

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

... berbaris tanpa henti, dan meskipun kita baru saja melakukan ini beberapa perintah yang lalu, untuk membuat intinya kita membalikkan keadaan sehingga transmogrifikasi adalah dari RSA ke 'kunci publik' biasa yang lama:

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

... yang membawa kita kembali ke awal. Apa yang telah kita pelajari?

Ringkasan: kuncinya secara internal sama, hanya terlihat berbeda. Komentar sebelumnya menunjukkan format kunci RSA didefinisikan dalam PKCS # 1, dan format 'kunci publik' lama didefinisikan dalam PKCS # 8. Namun, mengedit satu formulir tidak mengubahnya menjadi yang lain. Mudah-mudahan sekarang saya telah mengalahkan perbedaan ini sampai mati.

Jika masih ada percikan kehidupan yang tersisa, mari kita cambuk ini sedikit lagi dan referensi sertifikat yang awalnya dibuat dengan kunci pribadi RSA dulu sekali, memeriksa kunci publik dan modulusnya:

>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

... dan mereka semua hidup bahagia selamanya: sertifikat memiliki nilai modulus yang sama dengan kunci publik RSA, kunci pribadi RSA, dan 'kunci publik' biasa. Sertifikat berisi nilai 'kunci publik' biasa yang sama dengan yang kita lihat sebelumnya, meskipun itu ditandatangani dengan file yang ditandai sebagai kunci pribadi RSA. Aman untuk mengatakan ada konsensus.

Tidak ada kata kunci yang setara dengan 'RSAPublicKey_out' di kuadran X509 galaksi OpenSSL, jadi kami tidak dapat mencobanya, meskipun nilai modulusnya dijelaskan sebagai "modulus kunci RSA" yang menurut saya sedekat yang akan kita dapatkan.

Bagaimana semua ini akan terlihat dengan sertifikat yang ditandatangani DSA, saya tidak tahu.

Saya menyadari ini tidak menjawab pertanyaan awal, tetapi mungkin ini memberikan beberapa latar belakang yang berguna. Jika tidak, mohon maaf. Paling tidak, hal-hal yang tidak boleh dilakukan dan asumsi yang tidak boleh dibuat.

Tidak diragukan lagi seseorang telah memperhatikan pengulangan yang sedikit menjengkelkan dari "menulis kunci RSA", ketika tidak melakukan hal seperti itu. Saya berasumsi apa yang dimaksud adalah bahwa modul rsa mengenali kunci publik lama biasa sebagai kunci RSA yang sebenarnya, dan itulah mengapa ia terus menggunakan "kunci RSA" (ditambah lagi itu adalah modul rsa). Jika saya mengingatnya dengan benar, struktur EVP_PKEY generik memiliki gabungan untuk semua jenis kunci, dengan setiap jenis kunci memiliki kumpulan nilai khusus (yang diberi nama g, w, q, dan konsonan lainnya).

Sebagai kesimpulan, saya mencatat ada keluhan terkait pemrograman & pengembangan; sekarang, setiap perintah OpenSSL jelas memiliki kode yang sesuai, dan jika seseorang ingin menjelajahi semua keajaiban pemrograman OpenSSL hari ini, baris perintah akan tampak sebagai tempat yang masuk akal untuk memulai. Dalam kasus khusus ini (karena saya menggunakan cygwin baru-baru ini saat ini), seseorang dapat memulai dengan meninjau \ openssl-1.0.2f \ apps \ rsa.c dan (yang memiliki toleransi tinggi untuk makro) \ openssl-1.0. 2f \ crypto \ pem \ pem_all.c

Lark
sumber
8

Satu-satunya perbedaan antara pub1 dan pub2 Anda, selain header / footer, adalah string tambahan ini di pub2: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A . Jika Anda menghapusnya, Basis 64 identik dengan yang ada di pub1.

String tambahan sesuai dengan pengenal algoritme menurut Jawaban ini .

gtrig
sumber