【问题标题】:Is this exponential distribution sampler cryptographically secure?这个指数分布采样器在密码学上是否安全?
【发布时间】: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


【解决方案1】:

,所呈现的指数分布采样器加密不安全。 JavaScript 的 Math.random() 在密码学上是不安全的,而您用于对分布进行采样的 inverse transform method 不会改变这一事实。

虽然我不清楚你为什么真的想使用加密安全的随机源,但如果你愿意的话,你可以。

但是,您可能对这些术语感到困惑。出于加密目的,您真的需要大量的不可预测性,还是仅仅需要大量的统计随机性?

如果您确实需要加密安全,请使用转换为浮点区间 [0, 1) 的 CSPRNG 而不是 Math.random(),否则您应该可以使用简单的高质量 PRNG

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多