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?
Jawaban:
Menggunakan phpseclib, implementasi PHP RSA murni ...
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
Saya ingin membantu menjelaskan apa yang terjadi di sini.
"Kunci Publik" RSA terdiri dari dua angka:
Menggunakan kunci publik RSA Anda sebagai contoh, kedua angka tersebut adalah:
Pertanyaannya kemudian menjadi bagaimana kita ingin menyimpan angka-angka ini di komputer. Pertama kami mengonversi keduanya menjadi heksadesimal:
RSA menemukan format pertama
RSA menemukan format terlebih dahulu:
Mereka memilih untuk menggunakan ragam DER dari standar pengkodean biner ASN.1 untuk mewakili dua angka [1] :
Pengkodean biner terakhir di ASN.1 adalah:
Jika Anda kemudian menjalankan semua byte itu bersama-sama dan menyandikannya Base64, Anda mendapatkan:
Lab RSA kemudian berkata tambahkan header dan trailer:
Lima tanda hubung, dan kata-kata
BEGIN RSA PUBLIC KEY
. Itu adalah kunci Publik PEM DER ASN.1 PKCS # 1 RSA AndaBukan hanya RSA
Setelah itu, bentuk kriptografi kunci publik lainnya muncul:
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:
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:
1.2.840.113549.1.1.1
Jadi untuk kunci publik RSA itu pada dasarnya:
Sekarang mereka membuat SubjectPublicKeyInfo yang pada dasarnya:
Dalam definisi DER ASN.1 sebenarnya adalah:
Itu memberi Anda ASN.1 dari:
Pengkodean biner terakhir di ASN.1 adalah:
Dan seperti sebelumnya, Anda mengambil semua byte itu, menyandikannya Base64, Anda berakhir dengan contoh kedua:
Tambahkan tajuk dan cuplikan yang sedikit berbeda, dan Anda mendapatkan:
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
24 byte pertama itu adalah hal "baru" yang ditambahkan:
Dan karena kebetulan keberuntungan dan keberuntungan yang luar biasa:
Karena di Base64: 3-byte menjadi empat karakter:
Itu berarti jika Anda mengambil kunci publik X.509 kedua, 32 karakter pertama hanya sesuai dengan hal yang baru ditambahkan:
Jika Anda menghapus 32 karakter pertama, dan mengubahnya menjadi BEGIN RSA PUBLIC KEY :
Anda memiliki apa yang Anda inginkan -
RSA PUBLIC KEY
format lama .sumber
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:
Untuk mengubah dari PKCS # 1 ke PKCS # 8:
sumber
unknown option -RSAPublicKey_in
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:
(Oh, kengerian! Saya telah mengungkap kunci pribadi. Meh ...)
Saya mengekstrak dan menampilkan kunci publiknya:
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:
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:
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):
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:
... dan ketika kami mentransmisikan 'kunci publik' lama yang biasa menjadi kunci publik RSA:
... 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:
... 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:
... 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
sumber
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 .
sumber