首頁 >後端開發 >C++ >如何在 .NET 中使用 OpenSSL RSA 金鑰?

如何在 .NET 中使用 OpenSSL RSA 金鑰?

Patricia Arquette
Patricia Arquette原創
2024-11-04 16:17:02203瀏覽

How to Use an OpenSSL RSA Key with .NET?

在.Net 中使用OpenSSL RSA 金鑰

問題:

問題:.Net🎜>.Net 框架在下列情況下。下引發異常由於格式不匹配,嘗試使用透過OpenSSL 產生的RSA 公鑰。金鑰採用 PKCS#1 格式,而 .Net 則需要 X.509 格式。

解:

從 PKCS#1 轉換為 X。 509 格式:

從 PKCS#1 轉換 RSA 公鑰對於 X.509 格式,請使用 PEM_write_bio_PUBKEY 函數而非 PEM_write_bio_RSAPublicKey。這將以SubjectPublicKeyInfo 格式輸出帶有 OID 和公鑰的金鑰。 此外,您需要使用 EVP_PKEY_set1_RSA 將 RSA 金鑰轉換為 EVP_PKEY。

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

範例程式碼:

此程式碼產生 RSA 金鑰對並以 ASN.1/DER 和 PEM 格式寫入公鑰。然後,您可以在 .Net 應用程式中使用 X.509 格式的公鑰。

以上是如何在 .NET 中使用 OpenSSL RSA 金鑰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn