【问题标题】:Generating an RSA Key Pair with Erlang?使用 Erlang 生成 RSA 密钥对?
【发布时间】:2011-01-07 09:34:35
【问题描述】:

Erlang 有一个加密函数,可以生成公钥(下面复制的文档)。但是文档似乎含糊不清,我找不到任何描述如何生成共享素数或生成器的示例代码。有人可以发布一个生成公钥/私钥对的示例吗?提前感谢您的帮助!

dh_generate_key(DHParams) -> {PublicKey,PrivateKey} 
dh_generate_key(PrivateKey, DHParams) -> {PublicKey,PrivateKey} 

类型: DHParameters = [P, G] P, G = 品脱 其中 P 是共享素数,G 是共享生成器。 PublicKey, PrivateKey = Mpint() 生成 Diffie-Hellman PublicKey 和 PrivateKey(如果未给出)。

【问题讨论】:

  • 你知道 RSA 和 Diffie-Hellman 的区别吗?
  • 如果您解释了为什么需要 RSA 密钥对,这可能会有所帮助。无意冒犯,但如果您混淆了 RSA 和 DH,您可能会在不知不觉中尝试使用不适合您的应用程序的加密算法。也许我们可以推荐一个更合适的。
  • 如果你只是想得到一对RSA的公钥和私钥,试试这个:crypto:generate_key(rsa, {1024, 3})

标签: erlang cryptography rsa public-key private-key


【解决方案1】:

您不会为 Diffie-Hellman 生成共享素数或生成器。见:

http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange

参数P和G是双方提前约定好的。使用*文章的符号,crypto:dh_generate_key 用于步骤 2 和 3 以生成 a/Ab/B,然后 crypto:dh_compute_key 用于步骤 4 和 5 以计算共享秘密s

对于RSA,我不知道生成公钥/私钥对的标准库函数。根据我的记忆,生成素数是一个相当复杂的算法。我强烈建议您不要尝试自己编写代码。 Diffie-Hellman 密钥对不适合用于 RSA;它们是用于不同目的的不同算法。

通常您不需要在运行时生成这些,因为您可以重复使用密钥对。您可以使用任意数量的其他来源来实际生成它。 (也许 ssh-keygen 会起作用?而且总是有 OpenSSL。)要使用您创建的密钥对,您可以使用 crypto:rsa_ public/private _ encrypt/decrypt 函数。

【讨论】:

    【解决方案2】:

    见 cutkey (https://github.com/yrashk/cutkey)

    "cutkey 是一个用于生成 RSA 密钥的 Erlang 应用程序。它被实现为 在线程上调用 OpenSSL 的 RSA_generate_key 的端口驱动程序 异步池。”

    【讨论】:

      【解决方案3】:

      os:command("openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048").

      【讨论】:

        【解决方案4】:

        您可以使用 crypto:generate_key/2 函数来创建 RSA 公钥和私钥:

        对于 2048 长度

        {Pub, Priv} = crypto:generate_key(rsa, {2048,65537}).
        

        或者对于 1024 长度

        {Pub, Priv} = crypto:generate_key(rsa, {1024,65537}).
        

        参见:https://erlang.org/doc/apps/crypto/crypto.pdf(第 37 页)

        generate_key(Type, Params) -> {PublicKey, PrivKeyOut}
        

        在哪里

        Type = rsa
        
        
        Params = rsa_params() =
            {ModulusSizeInBits :: integer(),
             PublicExponent :: key_integer()} 
        

        【讨论】: