在Erlang中从RSA私钥生成x509公钥

时间:2012-07-02 20:07:29

标签: erlang rsa x509

我在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"...>>}]

感谢。

1 个答案:

答案 0 :(得分: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")))))).