2012-06-10 68 views
0

跟進this oneErlang - 解碼RSA公開密鑰

我讀/解碼工作

1> {ok, F} = file:read_file("inaimathi.rsapub"). 
{ok,<<"-----BEGIN RSA PUBLIC KEY-----\nmQINBE9NBIQBEADMSzN6b0FaPP0rGiLDWKfH4ehN66Z0SAIynXm6lBHjmO69pNsm\niIe4p1X9aXhr"...>>} 
2> [Entry] = public_key:pem_decode(F). 
[{'RSAPublicKey',<<153,2,13,4,79,77,4,132,1,16,0,204,75, 
        51,122,111,65,90,60,253,43,26,34,195, 
        88,167,...>>, 
       not_encrypted}] 

the docs,我爲了得到一個工作公鑰出這做的最後一件事是對Entry運行public_key:pem_entry_decode/1。但是,當我嘗試這樣做時,我得到了一個錯誤。

3> public_key:pem_entry_decode(Entry). 
** exception error: no match of right hand side value 
        {error, 
         {asn1, 
          {{badmatch,{error,{asn1,{wrong_tag,{131097,16}}}}}, 
          [{'OTP-PUB-KEY',dec_RSAPublicKey,2, 
            [{file,"OTP-PUB-KEY.erl"},{line,5956}]}, 
           {'OTP-PUB-KEY',decode,2, 
            [{file,"OTP-PUB-KEY.erl"},{line,493}]}, 
           {public_key,der_decode,2, 
            [{file,"public_key.erl"},{line,166}]}, 
           {erl_eval,do_apply,6, 
            [{file,"erl_eval.erl"},{line,576}]}, 
           {shell,exprs,7,[{file,"shell.erl"},{line,668}]}, 
           {shell,eval_exprs,7, 
            [{file,"shell.erl"},{line,623}]}, 
           {shell,eval_loop,3, 
            [{file,"shell.erl"},{line,608}]}]}}} 
    in function public_key:der_decode/2 (public_key.erl, line 170) 

我在做什麼錯在這裏?

編輯:沒想到會有影響,但有人問,所以。

我在一臺核心i3上運行Debian Wheezy,安裝了Erlang,安裝時間爲〜2天,結帳時間爲this

erl --version

Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] 
+0

其中OTP版本的? – user425720

+0

@ user425720 - 增加了問題的版本信息。 – Inaimathi

回答

4

你的代碼工作正常,在這裏:

decode() -> 
    [application:start(X) || X <- [crypto, public_key, ssl]], 
    RawData = ["-----BEGIN PUBLIC KEY-----\n", 
       "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBm8yuHmd0P6scl48DEi+xp47w\n", 
       "XVZaKWRygGKtA2XkdRuCU99f0Tq07Llcgf8XuR+Wnk+z2CdMMFMzOGhCePblVIAn\n", 
       "33dcBVlDokpBF7AnTClsaLcixxZw1LIUiaPaBdN7oG8vt3G2caLHRrrkoEnccY+6\n", 
       "GadfH7iuHdcVsz1mowIDAQAB\n", 
       "-----END PUBLIC KEY-----"], 
    D = iolist_to_binary(RawData), 
    [Entry] = public_key:pem_decode(D), 
    public_key:pem_entry_decode(Entry). 

生成輸出(縮短):

{'RSAPublicKey',135956...,65537} 
+1

這段代碼也適用於我的目的。我猜這意味着我試圖解碼的密鑰有一些編碼問題?你是如何產生一個你用作例子的? – Inaimathi

+0

我只是把它從一些隨機的網頁上偷走:) –

+0

只是想我會評論谷歌的好處;對於使用OpenSSL或M2Crypto生成的密鑰,這似乎可以正常工作。它似乎不適用於使用OpenSSH/GnuPG生成的密鑰並轉換爲PEM格式(儘管有一個public_key:ssh_decode/2可以與OpenSSH公鑰一起使用)。 – Inaimathi