【发布时间】:2017-10-18 17:04:09
【问题描述】:
我正在尝试使用 JavaScript 创建一个指数随机数生成器,该生成器使用先前 StackOverflow 答案中的方法工作。 :
function randomNumGen() {
var u = Math.random();
var mu = 0.3;
return -Math.log(1.0 - u) / mu;
}
但是,我后来发现使用 Math.random() 与另一个 StackOverflow 答案相比,在密码学上并不安全。但是,我不完全确定在我的情况下它是否是加密安全的,因为它使用u 的均匀随机性对抗指数分布来制作样本,但我认为它不安全。
在第二个站点中,它推荐了其他库,但是它们使用不同的分布,而不是指数分布。我认为我不能简单地将Math.random() 替换为他们的一个(例如 window.crypto.getRandomValues),因为它不统一。
关于我能做什么的任何见解?
【问题讨论】:
-
“数学上的安全”是什么意思?密码安全涉及状态空间太大而无法暴力破解以及基于过去输出预测未来输出的计算不可行性。在蒙特卡洛模拟(这是使用指数随机变量的主要地方)之类的事情中,这些考虑都不是非常重要的。您要防范什么样的攻击?
-
@JohnColeman 抱歉,我认为它们是同义词。我正在尝试实现加密安全
-
您想要达到的最终目标是什么?指数分布和加密安全的结合看起来有点奇怪。
-
通过一个易于反转的函数运行一个加密安全的 RNG 会产生一个安全的 RNG。否则——原始 RNG 的攻击者将能够利用它。打破转换后的 RNG,然后向后工作。
-
CSPRNG 的输出根据定义在计算上与真正的随机性无法区分,因此保证随机数是均匀分布的。
标签: javascript random cryptography distribution exponential-distribution