首页 > 后端开发 > C++ > 如何在 C 中正确播种 MT19937 PRNG 以实现安全随机数生成?

如何在 C 中正确播种 MT19937 PRNG 以实现安全随机数生成?

DDD
发布: 2024-11-29 01:11:11
原创
681 人浏览过

How Can I Properly Seed the MT19937 PRNG in C   for Secure Random Number Generation?

如何在 C 中彻底播种 MT19937 PRNG

通常,std::random_device 用于生成随机数,如下面的代码:

std::random_device rd;  
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);
登录后复制

但是,这个方法是有缺陷,因为:

  • std::random_device() 返回的熵不足。
  • std::mt19937 gen(rd());gen() 可能无法产生良好的输出分布。
  • std::random_device 可以实现为具有固定值的 PRNG

更可靠的方法是使用 CSPRNG(例如 Windows 上的 CryptGenRandom 或类 Unix 系统上的 /dev/urandom)来生成高质量的随机字节来为 PRNG 播种。例如:

#include <bit>
#include <iostream>
#include <string>

size_t sysrandom(void* dst, size_t dstlen) {
    std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in);
    stream.read((char*)dst, dstlen);
    return dstlen;
}

int main() {
    std::uint_least32_t seed;
    sysrandom(&seed, sizeof(seed));
    std::mt19937 gen(seed);

    // Your code to use the generator here...
    return 0;
}
登录后复制

此代码使用 /dev/urandom 作为 CSPRNG,并使用 32 位值作为 PRNG 的种子,应该增加该值以提高安全性。这种方法是可移植的、经过充分测试且易于使用的,为在 C 中生成随机数提供了坚实的基础。

以上是如何在 C 中正确播种 MT19937 PRNG 以实现安全随机数生成?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板