gpt4 book ai didi

用于 Diffie-Hellman key 交换的 C++ GMP 随机数生成

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:39 24 4
gpt4 key购买 nike

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

        mpz_class privateKey;
unsigned long seed;
mpz_init(privateKey.get_mpz_t());

gmp_randstate_t rstate;
gmp_randinit_mt(rstate);
gmp_randseed_ui(rstate, seed);

mpz_urandomm(privateKey.get_mpz_t(), rstate, prime.get_mpz_t());

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

最佳答案

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

如果您使用相同的种子初始化 RNG,您将始终获得相同的随机数。这可能就是您的程序中发生的情况:seed 未初始化,因此它的值是该地址之前堆栈中的任何值,如果您调用此函数,结果总是相同以同样的方式。

由于这是一个加密应用程序,您需要使用高熵源为随机数生成器提供种子。询问您的操作系统(无法在程序内部生成熵):在 Linux 上从 /dev/urandom 读取,在 Windows 上调用 CryptGenRandom

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

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

关于用于 Diffie-Hellman key 交换的 C++ GMP 随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46379624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com