4

私はErlangでアプリケーションを作成しており、RSA秘密鍵を指定すると、RSA公開鍵とその秘密鍵に関連付けられたx509公開鍵を返すことができます。

秘密鍵からモジュラスと公開指数を取得するだけで、RSA公開鍵を生成できることはわかっています。

--from OTP-PUB-KEY.hrl
-record('RSAPrivateKey',{
version, modulus, publicExponent, privateExponent, prime1, prime2, exponent1, exponent2,     coefficient, otherPrimeInfos = asn1_NOVALUE}).

-record('RSAPublicKey',{
modulus, publicExponent}).  

しかし、どうすればx509公開鍵を生成できますか?

私はこれが可能であることを知っています。なぜなら、perlで書かれた私の古いコードは、次のようなものを呼び出すことによってそれを行っていたからです。

$private = Crypt::OpenSSL::RSA->new_private_key( $hash_ref->{'private'} );
{rsa  => $private->get_public_key_string(),
 x509 => $private->get_public_key_x509_string()};

誰かがそれを行う方法を知っていますか?

-----更新だけ----

x509について学び、Erlang public_keyのドキュメントを読んだ後、解決策を見つけました。

モジュラスとpublicExponentを取得するだけで、「RSAPrivateKey」から「RSAPublicKey」を生成できるとすると、両方のキーを生成するコードは次のようになります。

getPublicKeysFromPrivateKey(#'RSAPrivateKey'{modulus = M, publicExponent = PE}) ->
    RSAPub = #'RSAPublicKey'{modulus = M, publicExponent = PE},

    %% Encoding the keys
    RSAPublicKey = public_key:pem_encode([public_key:pem_entry_encode('RSAPublicKey', RSAPub)]),
    X509PublicKey = public_key:pem_encode([public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPub)]),

    [{rsa, RSAPublicKey},{x509, X509PublicKey}].

どちらが生成されます:

[{rsa,<<"-----BEGIN RSA PUBLIC KEY----- \nMIGJAoGBAMU8ZcQ4S+gHDuZd6cEdqbf9l1Hw4fxQrJ455B2kJRUwyKidVbCH2omy\nI0SLNu92"...>>},
 {x509,<<"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFPGXEOEvoBw7mXenBHam3/ZdR\n8OH8UKye"...>>}]

ありがとう。

4

1 に答える 1

1

明らかなことは次のとおりです。

public_key(#'RSAPrivateKey'{modulus = Mod, publicExponent = Exp}) ->
    #'RSAPublicKey'{modulus = Mod, publicExponent = Exp}.

以下から有効なレコードを生成するようです:

public_key(public_key:pem_entry_decode(hd(public_key:pem_decode(element(2, file:read_file("<OTP Src Dir>/lib/public_key/test/public_key_SUITE_data/server_key.pem")))))).
于 2012-07-02T22:10:04.870 に答える