Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menukar Kunci Awam OpenSSL RSA kepada Format Serasi .Net?

Bagaimana untuk Menukar Kunci Awam OpenSSL RSA kepada Format Serasi .Net?

Linda Hamilton
Lepaskan: 2024-11-04 06:00:29
asal
828 orang telah melayarinya

How to Convert OpenSSL RSA Public Keys to .Net Compatible Format?

Gunakan OpenSSL RSA Key dengan .Net

Apabila menjana pasangan kunci awam-swasta menggunakan RSA_generate_key(), OpenSSL mengeluarkan kunci awam dalam format berikut:

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
Salin selepas log masuk

Walau bagaimanapun, sesetengah modul dalam .Net memerlukan kunci dalam format ini:

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
Salin selepas log masuk

Untuk menukar kunci kepada format yang diperlukan, gunakan PEM_write_bio_PUBKEY dan bukannya PEM_write_bio_RSAPublicKey. Yang pertama menulis SubjectPublicKeyInfo, termasuk OID dan kunci awam.

Untuk menukar kunci, ikut langkah berikut:

  1. Buat EVP_PKEY menggunakan EVP_PKEY_set1_RSA.
  2. Tukar kunci RSA kepada format ASN.1/DER menggunakan i2d_RSA_PUBKEY_bio atau kepada format PEM menggunakan PEM_write_bio_PUBKEY.

Contoh C

Atur cara C berikut menunjukkan penukaran :

<code class="cpp">#include <memory>
#include <openssl/bn.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <openssl/x509.h>

#include <cassert>
#define ASSERT assert

using BN_ptr = std::unique_ptr<BIGNUM, decltype(&::BN_free)>;
using RSA_ptr = std::unique_ptr<RSA, decltype(&::RSA_free)>;
using EVP_KEY_ptr = std::unique_ptr<EVP_PKEY, decltype(&::EVP_PKEY_free)>;
using BIO_FILE_ptr = std::unique_ptr<BIO, decltype(&::BIO_free)>;

int main(int argc, char* argv[])
{
    int rc;

    RSA_ptr rsa(RSA_new(), ::RSA_free);
    BN_ptr bn(BN_new(), ::BN_free);

    BIO_FILE_ptr pem1(BIO_new_file("rsa-public-1.pem", "w"), ::BIO_free);
    BIO_FILE_ptr pem2(BIO_new_file("rsa-public-2.pem", "w"), ::BIO_free);
    BIO_FILE_ptr der1(BIO_new_file("rsa-public-1.der", "w"), ::BIO_free);
    BIO_FILE_ptr der2(BIO_new_file("rsa-public-2.der", "w"), ::BIO_free);

    rc = BN_set_word(bn.get(), RSA_F4);
    ASSERT(rc == 1);

    // Generate key
    rc = RSA_generate_key_ex(rsa.get(), 2048, bn.get(), NULL);
    ASSERT(rc == 1);

    // Convert RSA key to PKEY
    EVP_KEY_ptr pkey(EVP_PKEY_new(), ::EVP_PKEY_free);
    rc = EVP_PKEY_set1_RSA(pkey.get(), rsa.get());
    ASSERT(rc == 1);

    //////////

    // Write just the public key in ASN.1/DER
    // Load with d2i_RSAPublicKey_bio
    rc = i2d_RSAPublicKey_bio(der1.get(), rsa.get());
    ASSERT(rc == 1);

    // Write just the public key in PEM
    // Load with PEM_read_bio_RSAPublicKey
    rc = PEM_write_bio_RSAPublicKey(pem1.get(), rsa.get());
    ASSERT(rc == 1);

    // Write SubjectPublicKeyInfo with OID and public key in ASN.1/DER
    // Load with d2i_RSA_PUBKEY_bio
    rc = i2d_RSA_PUBKEY_bio(der2.get(), rsa.get());
    ASSERT(rc == 1);

    // Write SubjectPublicKeyInfo with OID and public key in PEM
    // Load with PEM_read_bio_PUBKEY
    rc = PEM_write_bio_PUBKEY(pem2.get(), pkey.get());
    ASSERT(rc == 1);

    return 0;
}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menukar Kunci Awam OpenSSL RSA kepada Format Serasi .Net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan