【发布时间】:2020-08-23 08:30:37
【问题描述】:
我目前正在编写一个我想在 GitHub 上分享的加密算法。该算法接受随机位作为输入。我知道有很多可能的伪随机位来源,其中最奇怪的是你可以买到它们。因为伪随机数生成器的质量和来源差异很大,我希望用户能够生成自己的伪随机位作为我算法的输入。我不知道如何以一般方式编写我的算法,因为我不知道专业密码学或统计项目中的伪随机数来自什么数据结构,以及我应该如何编写模板函数来最一般地访问这些伪随机数方式。
我的函数 my_distribution 将访问伪随机数生成器。我假设 PRNG 将返回 0 到 1 之间的双精度,或者返回我可以转换为 0 到 1 之间的双精度的数据类型。
double my_distribution([pseudorandom number generator]) {
double random_number_from_my_distribution;
// compute random_number_from_my_distribution using the PRNG
return random_number_from_my_distribution;
}
我能想到的伪随机位有几个可能的来源。
- 伪随机位可以存储在运行时打开的文件中
- 伪随机位可以由(非 io)流提供。
- 伪随机位可以是函数的返回值。
- 伪随机位可以存储在其他数据结构中。
我应该如何在 my_distribution 中接受伪随机位?为什么?
【问题讨论】:
-
@JohnKugelman 您链接中的 uniform_random_bit_generator 概念回答了这个问题,谢谢。
-
在...专业的密码学或统计项目...中,PRN 肯定不是来自 John 引用的参考文献中提到的引擎。您需要不同类别的 PRNG,称为 CSPRNG。 Standard C++ library does not provide any PRNG which is cryptographically secure. 我建议使用 Crypto++ 或更简单的使用 Duthomhas/CSPRNG。