Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konvertiert man öffentliche OpenSSL-RSA-Schlüssel in ein .Net-kompatibles Format?

Wie konvertiert man öffentliche OpenSSL-RSA-Schlüssel in ein .Net-kompatibles Format?

Linda Hamilton
Linda HamiltonOriginal
2024-11-04 06:00:29678Durchsuche

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

OpenSSL-RSA-Schlüssel mit .Net verwenden

Beim Generieren eines öffentlich-privaten Schlüsselpaars mit RSA_generate_key() gibt OpenSSL öffentliche Schlüssel im aus folgendes Format:

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

Einige Module in .Net erfordern jedoch Schlüssel in diesem Format:

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

Um die Schlüssel in das erforderliche Format zu konvertieren, verwenden Sie PEM_write_bio_PUBKEY anstelle von PEM_write_bio_RSAPublicKey. Ersteres schreibt die SubjectPublicKeyInfo, einschließlich der OID und des öffentlichen Schlüssels.

Um den Schlüssel zu konvertieren, folgen Sie diesen Schritten:

  1. Erstellen Sie einen EVP_PKEY mit EVP_PKEY_set1_RSA.
  2. Konvertieren Sie den RSA-Schlüssel mit i2d_RSA_PUBKEY_bio in das ASN.1/DER-Format oder mit PEM_write_bio_PUBKEY in das PEM-Format.

C-Beispiel

Das folgende C-Programm demonstriert die Konvertierung :

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

Das obige ist der detaillierte Inhalt vonWie konvertiert man öffentliche OpenSSL-RSA-Schlüssel in ein .Net-kompatibles Format?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn