【问题标题】:generation of safe primes安全素数的产生
【发布时间】:2011-07-19 19:25:20
【问题描述】:

我需要生成一个形式为 2p + 1 的安全素数,其中 p 也是某个素数 位长(比如说 1024 位)。它用于 DH 密钥交换。

我相信 openssl 可以通过

openssl gendh 1024

但是这个返回是 base64 pem 格式

-----BEGIN DH PARAMETERS-----
MIGHAoGBANzQ1j1z7RGB8XUagrGWK5a8AABecNrovcIgalv1hQdkna2PZorHtbOa
wYe1eDy1t/EztsM2Cncwvj5LBO3Zqsd5tneehKf8JoT35/q1ZznfLD8s/quBgrH8
es2xjSD/9syOMMiSv7/72GPJ8hzhLrbTgNlZ+kYBAPw/GcTlYjc7AgEC
-----END DH PARAMETERS-----
  • 如何从这个 base64 pem 中提取安全素数?

  • 用我自己的代码生成自己的安全素数是否更容易?

我如何测试素数是否“安全”且具有一定的位长。

【问题讨论】:

  • 安全来自什么/出于什么目的?如果您要进行 Diffie-Helman (DH) 密钥交换,为什么不使用现有代码?
  • 我正在做 SPEKE,它使用 DH 并且需要一个安全的启动程序才能运行。所以没有现成的代码。
  • 您是否能够以编程方式使用 OpenSSL 而不是在命令行上调用它?您使用什么语言?
  • 并非如此,我编写的语言不能轻易调用 C 代码,如果是这种情况,我可以在将其编码为 pem 格式之前轻松复制我需要的部分。
  • 在这种情况下,您可以在 C/C++ 中创建一个简单的可执行文件并从您的应用程序中调用它吗?似乎这比生成 PEM 然后解码它更容易。您已经在对 OpenSSL 进行外部调用。

标签: encryption openssl primes


【解决方案1】:

我同意@Luke 制作的cmets。但是,如果出于某种原因您必须使用 openssl 命令行,则有一些选项,但它们只能帮助您到此为止。这些都不会为您做任何重要的算术;他们不会检索 (p-1)/2 并检查它的素数。

您可以使用openssl dh 命令并解析输出。尝试使用和不使用-C 选项,看看哪个更适合您。例子。

openssl gendh -out testdh.pem 1024
openssl dh -in testdh.pem -noout -C
openssl dh -in testdh.pem -noout

如果您可以处理或更喜欢二进制,那么您可以解析 DER 编码的 DH 结构的二进制输出。

openssl dh -in testdh.pem -outform der -out testdh.der

另一种选择是解析 ans1parse 命令的输出:

openssl asn1parse -in testdh.pem

【讨论】:

  • 在此基础上,您可以使用 asn1parse 命令并获取“prim:”字段并解析出 256 个字符长的 ASCII-Hex 数字。如果你确保它是 256 个 ASCII 字符,你就知道你提取了一个 1024 位的数字。然后,您可以使用您选择的素数测试来测试 p 和 (p-1)/2 以确保它们都是素数。
  • 我们如何创建 testdh.dh ? gendh 生成一个 .pem 文件。
  • 错字。修复,尽管您可以随意命名文件。
【解决方案2】:

@GregS 有一种可能适合您的方法。根据您告诉我的内容,我将创建一个 C 二进制文件并利用 OpenSSL 中的 BN_generate_prime(...) 函数。这消除了所有中间解析,尽管在混合中添加了一个单独的二进制文件,但它可能比你前进的道路更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2013-11-10
    • 2011-06-30
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多