Heim >Backend-Entwicklung >C++ >Wie verwende ich einen OpenSSL-RSA-Schlüssel mit .NET?

Wie verwende ich einen OpenSSL-RSA-Schlüssel mit .NET?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-04 16:17:02203Durchsuche

How to Use an OpenSSL RSA Key with .NET?

OpenSSL-RSA-Schlüssel mit .Net verwenden

Problem:
Das .Net-Framework löst eine Ausnahme aus, wenn Aufgrund einer Formatinkongruenz wird versucht, einen mit OpenSSL generierten öffentlichen RSA-Schlüssel zu verwenden. Der Schlüssel liegt im PKCS#1-Format vor, während .Net ein X.509-Format erwartet.

Lösung:

Konvertierung von PKCS#1 nach X. 509-Format:

Um den öffentlichen RSA-Schlüssel vom PKCS#1- in das X.509-Format zu konvertieren, verwenden Sie die Funktion PEM_write_bio_PUBKEY anstelle von PEM_write_bio_RSAPublicKey. Dadurch wird der Schlüssel im SubjectPublicKeyInfo-Format mit einer OID und dem öffentlichen Schlüssel ausgegeben.

Zusätzlich müssen Sie EVP_PKEY_set1_RSA verwenden, um den RSA-Schlüssel in einen EVP_PKEY umzuwandeln.

Beispiel Code:

<code class="c++">// Include necessary headers
#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(&amp;::BN_free)>;
using RSA_ptr = std::unique_ptr<RSA, decltype(&amp;::RSA_free)>;
using EVP_KEY_ptr = std::unique_ptr<EVP_PKEY, decltype(&amp;::EVP_PKEY_free)>;
using BIO_FILE_ptr = std::unique_ptr<BIO, decltype(&amp;::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 der1(BIO_new_file("rsa-public-1.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 SubjectPublicKeyInfo with OID and public key in ASN.1/DER
    rc = i2d_RSA_PUBKEY_bio(der1.get(), rsa.get());
    ASSERT(rc == 1);

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

    return 0;
}</code>

Dieser Code generiert ein RSA-Schlüsselpaar und schreibt den öffentlichen Schlüssel sowohl im ASN.1/DER- als auch im PEM-Format. Anschließend können Sie den X.509-formatierten öffentlichen Schlüssel mit Ihrer .Net-Anwendung verwenden.

Das obige ist der detaillierte Inhalt vonWie verwende ich einen OpenSSL-RSA-Schlüssel mit .NET?. 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