Diffie-Hellman Key Exchange的C ++ GMP随机数生成

时间:2017-09-23 12:34:09

标签: c++ gmp diffie-hellman

我需要为Diffie-Hellman密钥交换计算私钥(privateKey)。我给了一个大素数,现在我只需要选择一个小于p的数字。这是我的代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="dropdown">
  <button class="btn first">Select something</button>
  <ul class="btn-dropdown">
    <li>First</li>
    <li>Second</li>
    <li>Third</li>
    <li>Fourth</li>
  </ul>
</div>

<div class="dropdown">
  <button class="btn first">Select something</button>
  <ul class="btn-dropdown">
    <li>Black</li>
    <li>Brown</li>
    <li>Red</li>
    <li>Orange</li>
  </ul>
</div>

我真的不明白为什么我总是得到相同的“随机”数字。

1 个答案:

答案 0 :(得分:2)

您永远不会初始化seed变量,因此您的程序显然是错误的,您的编译器应该已经警告过您。如果没有,请查看如何正确配置编译器(例如,对于GCC,请确保至少通过-O -Wall)。

如果使用相同的种子初始化RNG,您将始终获得相同的随机数。这可能是你的程序中发生的事情:seed没有初始化,所以它的值是之前在这个地址堆栈上的任何东西,如果你在同一个地方调用这个函数,结果总是相同的方式。

由于这是一个加密应用程序,您需要使用高熵源为随机数生成器播种。向你的操作系统询问它(没有办法在程序中生成熵):在Linux上从/dev/urandom读取,在Windows上调用CryptGenRandom

此外,由于这是加密应用程序,因此请勿调用gmp_randinit_mt。这创建了一个Mersenne扭转器,它对于物理模拟来说快速且足够好,但不适用于加密,因为它的状态可以从其输出重建。我不熟悉GMP,但是看documentation,我发现它提供了几种随机数生成算法,但没有一种适用于安全应用程序。您可以直接使用/dev/urandomCryptGenRandom等操作系统源作为随机位源,但是您需要使用它来实现gmp_randstate_t接口以便将其连接起来与mpz_urandomm。我不知道那有多难。

如果这是学校练习,请做老师告诉你的事情。如果这是针对实际应用程序,请使用现有的加密库,例如libtom,它随您生成加密质量的随机数并执行Diffie-Hellman计算所需的一切,非常容易集成到项目,并拥有允许它集成到任何项目的许可证。