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

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

Linda Hamilton
Linda Hamiltonasal
2024-11-04 06:00:29679semak imbas

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

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

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

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>

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