Ben*_*n J 5 c++ random boost cryptography mersenne-twister
我想做这样的事情:
boost::random_device rd;
boost::random::mt19937_64 gen(rd());
boost::random::uniform_int_distribution<unsigned long long> dis;
uint64_t value = dis(gen);
Run Code Online (Sandbox Code Playgroud)
但我读过一个mersenne twister不是加密安全的.但是,我还读到了random_device,如果它从/ dev/urandom中提取数据,这可能是在linux平台(我的主平台)上.因此,如果random_device是非确定性随机的并且它用于播种mersenne twister(如上所示),那么这是否也使得mersenne twister在密码学上安全(即使它本身,它不是)?
我在这个舞台上有点新手所以任何建议都值得赞赏.
那么,我如何生成一个可以存储在uint64_t中的加密安全64位数?
谢谢,
本.
分析你的问题比看起来更难:
你用mersenne twister播种rd(),它返回一个unsigned int,因此(在大多数平台上)最多包含32个随机位.
从这一点来看,mersenne twister所做的一切都取决于那些32位.
这意味着value只能采用2**32个不同的值,如果存在任何攻击向量攻击您使用此数字执行的任何攻击向量,则可能会出现问题.实际上,mersenne twister的播种程序甚至可以减少第一个结果的可能值的数量,因为它将32个随机位分配到其完整状态(为了确保不是这种情况,您必须分析种子例程提升使用).
在这种情况下,mersenne twister的主要弱点(其状态可以在看到624个数字之后得出)在这种情况下甚至没有意义,因为你生成了一个如此短的序列(1个值).
假设这unsigned int相当于uint32_t您的平台,您可以使用以下方法轻松生成64个加密安全随机位boost::random_device:
boost::random_device rd;
std::uint64_t value = rd();
value = (value << 32) | rd();
Run Code Online (Sandbox Code Playgroud)
这是相当安全的,因为linux和windows的实现都使用操作系统自己的加密安全随机源.
虽然之前的工作做得很好,但您可能希望获得更灵活的解决方案.这很容易实现,你可以实际使用随机分配boost提供random_device.一个简单的例子是重写前面的解决方案,如下所示:
boost::random_device rd;
boost::random::uniform_int_distribution<std::uint64_t> dis;
std::uint64_t value = dis(rd);
Run Code Online (Sandbox Code Playgroud)
(虽然如果前一个实际上不包含[0,2**32]中的数字,理论上这也可以提供更强大的解决方案,但这在实践中不是问题.)
为了提高可用性,您经常会发现boost::bind将分布和生成器绑定在一起的用法.由于boost::bind复制了它的参数,并且复制ctor被删除了boost::random_device,你需要使用一个小技巧:
boost::random_device rd;
boost::random::uniform_int_distribution<std::uint64_t> dis;
boost::function<std::uint64_t()> gen = boost::bind(dis, boost::ref(rd));
std::uint64_t value = gen();
Run Code Online (Sandbox Code Playgroud)