Maison > développement back-end > C++ > Comment convertir les clés publiques OpenSSL RSA au format compatible .Net ?

Comment convertir les clés publiques OpenSSL RSA au format compatible .Net ?

Linda Hamilton
Libérer: 2024-11-04 06:00:29
original
784 Les gens l'ont consulté

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

Utiliser la clé OpenSSL RSA avec .Net

Lors de la génération d'une paire de clés publique-privée à l'aide de RSA_generate_key(), OpenSSL génère des clés publiques dans le format suivant :

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
Copier après la connexion

Cependant, certains modules de .Net nécessitent des clés dans ce format :

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
Copier après la connexion

Pour convertir les clés au format requis, utilisez PEM_write_bio_PUBKEY au lieu de PEM_write_bio_RSAPublicKey. Le premier écrit le SubjectPublicKeyInfo, y compris l'OID et la clé publique.

Pour convertir la clé, suivez ces étapes :

  1. Créez un EVP_PKEY en utilisant EVP_PKEY_set1_RSA.
  2. Convertissez la clé RSA au format ASN.1/DER à l'aide de i2d_RSA_PUBKEY_bio ou au format PEM à l'aide de PEM_write_bio_PUBKEY.

Exemple C

Le programme C suivant illustre la conversion :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal