在 .Net 中使用 OpenSSL RSA 密钥
问题:
.Net 框架在以下情况下引发异常由于格式不匹配,尝试使用通过 OpenSSL 生成的 RSA 公钥。密钥采用 PKCS#1 格式,而 .Net 需要 X.509 格式。
解决方案:
从 PKCS#1 转换为 X。 509 格式:
要将 RSA 公钥从 PKCS#1 转换为 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(&::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 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中文网其他相关文章!