2012-07-02 70 views
3

我在Erlang中創建了一個應用程序,它給出一個RSA私鑰,它可以返回RSA公鑰和與該私鑰相關聯的x509公鑰。從Erlang的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()}; 

有誰有任何想法如何做到這一點?

-----只是一個UPDATE ----

我已經找到了解決辦法花一些時間來學習X509和閱讀二郎PUBLIC_KEY文檔後:

鑑於我能產生「RSAPublicKey」從簡單地得到模量和publicExponent「RSAPrivateKey」,我的代碼生成兩個鍵應該是這樣的:

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

謝謝。

+0

你的意思是X509證書?你爲什麼認爲你需要這樣的事情? –

+0

我真的想要x509公鑰。這是RASPublicKey的另一種格式,其'PEM'格式將是'BEGIN PUBLIC KEY'而不是'BEGIN RSA PUBLIC KEY'。 – RobisonSantos

回答

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")))))).