.Net에서 OpenSSL RSA 키 사용
문제:
다음 경우에 .Net 프레임워크에서 예외가 발생합니다. 형식 불일치로 인해 OpenSSL로 생성된 RSA 공개 키를 사용하려고 합니다. 키는 PKCS#1 형식이지만 .Net에서는 X.509 형식을 기대합니다.
해결책:
PKCS#1에서 X로 변환합니다. 509 형식:
RSA 공개 키를 PKCS#1~X.509 형식의 경우 PEM_write_bio_RSAPublicKey 대신 PEM_write_bio_PUBKEY 함수를 사용하세요. 그러면 OID 및 공개 키가 포함된 SubjectPublicKeyInfo 형식의 키가 출력됩니다.
또한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!