我需要为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>
我真的不明白为什么我总是得到相同的“随机”数字。
答案 0 :(得分:2)
您永远不会初始化seed
变量,因此您的程序显然是错误的,您的编译器应该已经警告过您。如果没有,请查看如何正确配置编译器(例如,对于GCC,请确保至少通过-O -Wall
)。
如果使用相同的种子初始化RNG,您将始终获得相同的随机数。这可能是你的程序中发生的事情:seed
没有初始化,所以它的值是之前在这个地址堆栈上的任何东西,如果你在同一个地方调用这个函数,结果总是相同的方式。
由于这是一个加密应用程序,您需要使用高熵源为随机数生成器播种。向你的操作系统询问它(没有办法在程序中生成熵):在Linux上从/dev/urandom
读取,在Windows上调用CryptGenRandom
。
此外,由于这是加密应用程序,因此请勿调用gmp_randinit_mt
。这创建了一个Mersenne扭转器,它对于物理模拟来说快速且足够好,但不适用于加密,因为它的状态可以从其输出重建。我不熟悉GMP,但是看documentation,我发现它提供了几种随机数生成算法,但没有一种适用于安全应用程序。您可以直接使用/dev/urandom
或CryptGenRandom
等操作系统源作为随机位源,但是您需要使用它来实现gmp_randstate_t
接口以便将其连接起来与mpz_urandomm
。我不知道那有多难。
如果这是学校练习,请做老师告诉你的事情。如果这是针对实际应用程序,请使用现有的加密库,例如libtom,它随您生成加密质量的随机数并执行Diffie-Hellman计算所需的一切,非常容易集成到项目,并拥有允许它集成到任何项目的许可证。