> 백엔드 개발 > C++ > 본문

OpenSSL RSA 공개 키를 .Net 호환 형식으로 변환하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-04 06:00:29
원래의
678명이 탐색했습니다.

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

.Net에서 OpenSSL RSA 키 사용

RSA_generate_key()를 사용하여 공개-개인 키 쌍을 생성할 때 OpenSSL은 공개 키를 다음 형식:

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
로그인 후 복사

그러나 .Net의 일부 모듈에는 다음 형식의 키가 필요합니다.

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
로그인 후 복사

키를 필수 형식으로 변환하려면 PEM_write_bio_RSAPublicKey 대신 PEM_write_bio_PUBKEY를 사용하세요. 전자는 OID 및 공개 키를 포함하여 SubjectPublicKeyInfo를 작성합니다.

키를 변환하려면 다음 단계를 따르세요.

  1. EVP_PKEY_set1_RSA를 사용하여 EVP_PKEY를 생성합니다.
  2. i2d_RSA_PUBKEY_bio를 사용하여 RSA 키를 ASN.1/DER 형식으로 변환하거나 PEM_write_bio_PUBKEY를 사용하여 PEM 형식으로 변환합니다.

C 예

다음 C 프로그램은 변환을 보여줍니다. :

<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>
로그인 후 복사

위 내용은 OpenSSL RSA 공개 키를 .Net 호환 형식으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!