【问题标题】:Erlang - Decoding RSA public KeyErlang - 解码 RSA 公钥
【发布时间】:2012-06-10 14:13:00
【问题描述】:

跟进this one

我的阅读/解码工作正常

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)

我在这里做错了什么?

编辑:认为这并不重要,但有人问,所以。

我在 Core i3 上运行 Debian Wheezy,安装了 Erlang,来自 this 的约 2 天前结帐。

erl --version

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

【问题讨论】:

  • @user425720 - 为问题添加了版本信息。

标签: erlang rsa gnupg public-key


【解决方案1】:

您的代码在这里运行良好:

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}

【讨论】:

  • 这段代码也适用于我。我想这意味着我要解码的密钥存在一些编码问题?您是如何生成您用作示例的那个?
  • 我只是从一些随机网页上偷来的 :)
  • 只是想我会为了谷歌员工的利益发表评论;这似乎适用于使用 OpenSSL 或 M2Crypto 生成的密钥。它确实似乎适用于使用 OpenSSH/GnuPG 生成并转换为 PEM 格式的密钥(尽管有一个 public_key:ssh_decode/2 确实适用于 OpenSSH 公钥)。
  • 你真的要做 [application:start(X) || X
  • 当我在 12 年写这篇文章时,我认为你需要它。现在,我不太确定。你可以做application:ensure_all_started(public_key),但最好不要在你要进行的每个解码调用中。最好的解决方案是将应用程序依赖项作为发布的一部分来处理。
猜你喜欢
  • 2015-03-10
  • 2018-12-10
  • 2021-10-03
  • 2015-02-23
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多