在对其输出进行 SHA-1 处理后,可预测的随机数生成器如何(如果有的话)变得更加安全?

2024-04-16

本文 http://www.quadibloc.com/crypto/co4814.htm指出

尽管 Mersenne Twister 是一个非常好的伪随机数生成器,但由于非常简单的原因,它本身并不具有加密安全性。可以从生成器在任何给定时间所具有的状态确定生成器的所有未来状态,并且 624 个 32 位输出或 19,937 个一位输出足以提供该状态。建议在 Mersenne Twister 的输出上使用加密安全散列函数(例如 SHA-1)作为获取加密学中有用的密钥流的一种方法。

但没有任何参考资料说明为什么消化输出会使其更加安全。老实说,我不明白为什么会这样。 Mersenne Twister 的周期为 2^19937-1,但我认为我的推理也适用于任何周期性 PRNG,例如线性同余发生器也是如此。由于安全单向函数 h 的属性,人们可以将 h 视为单射函数(否则我们可能会产生冲突),从而简单地将值从其域以一对一的方式映射到其范围。

考虑到这一想法,我认为散列值将产生与原始 Mersenne Twister 完全相同的周期性行为。这意味着,如果您观察一个时期的所有值并且这些值开始重复出现,那么您完全能够预测所有未来值。

我认为这与基于密码的加密中应用的相同原理有关(PKCS#5 http://www.rsa.com/rsalabs/node.asp?id=2127) - 因为密码域没有提供足够的熵,简单地散列密码不会添加任何额外的熵 - 这就是为什么你需要在散列密码之前对密码进行加盐。我认为同样的原则也适用于此。

一个最终说服我的简单例子:假设你有一个非常糟糕的 PRNG,它总是会产生一个“随机数”1。那么即使 SHA-1 是一个完美的单向函数,将 SHA-1 应用于输出也会始终产生相同的值,从而使输出的可预测性不低于以前。

尽管如此,我还是相信那篇文章有一定道理,所以我肯定忽略了一些东西。你能帮我吗?在很大程度上,我从我的论点中遗漏了种子价值——也许这就是神奇发生的地方?


梅森扭曲器的状态由之前的定义n输出,其中n是复发程度(常数)。因此,如果你给攻击者n直接从梅森扭曲器输出,他们将立即能够预测所有未来值。

通过 SHA-1 传递值会使事情变得更加困难,因为现在攻击者必须尝试反转 RNG。然而,对于 32 位字长来说,这对于坚定的攻击者来说不太可能是一个严重的障碍;他们可以构建彩虹表或使用其他一些标准方法来反转 SHA-1,并且在发生冲突时,根据候选者是否产生观察到的 RNG 流来过滤候选者。因此,梅森扭曲器不应用于加密敏感应用程序、SHA-1 掩码或无加密的应用程序。有许多标准 CSPRNG http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Standards可以用它来代替。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在对其输出进行 SHA-1 处理后,可预测的随机数生成器如何(如果有的话)变得更加安全? 的相关文章

  • Node.JS Web 服务器中的安全性

    所以 我正在学习 Node JS 到目前为止我很喜欢它 我已经有几个项目在工作了 我想我可以在其中使用nodejs 不过 我担心安全问题 如果我使用 Node JS http 模块编写自定义 Web 服务器 我是否可能非常容易受到攻击 Ap
  • 在Python中选择长度为n的随机列表元素

    我知道你可以使用 random choice 从列表中选择一个随机元素 但我试图选择长度为 3 的随机元素 例如 list1 a b c d e f g h 我希望输出看起来像这样 c d e 本质上我想从列表中生成随机子列表 Use ra
  • 在iOS中生成范围内的随机数? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试让随机数生成器在 iPho
  • Java + OpenPGP 有什么推荐吗?

    我想开发一个小型 OpenPGP 客户端 并且正在寻找 OpenPGP 的 Java 库 对于这种方法有任何 开源 建议吗 Cryptix org http www cryptix org 似乎不再活着了 我找到了充气城堡 http www
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • 如何使用 OpenSSL 为 DNSSEC 生成 ECDSA 私钥和公钥?

    我正在尝试为 DNSSEC 算法 13 创建私钥和公钥 include
  • Firebase API 密钥限制不适用于 Android 应用程序包名称和 SHA1 指纹

    我们正在使用 Google Firebase 获取我们应用程序的 CrashLytics 数据 以及通过google services json文件被提出作为一个安全问题 因为应用程序 apk 文件可以被逆向工程来获取该文件 然后攻击者可以
  • 处理 PHP 中的会话劫持

    阅读了 Stackoverflow 上有关会话劫持的许多问题 我发现验证用户会话的唯一 解决方案 是检查用户代理 这是一个薄弱的保护层 我什至懒得去检查实施它 所以 我想知道你们实施了哪些解决方案 您是否使用 PHP 的本机会话或者是否有更
  • 对 Java 安全性和 BouncyCastle API 感到茫然和困惑

    我一直在尝试理解 Java 的 BouncyCastle 加密 API 不幸的是 我发现 Java 密码学总体上被服务提供者接口和术语所掩盖 以至于我无法理解任何东西的实际作用 我已经尝试反复阅读必要的文档 但它仍然难以理解 引入了许多远远
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • 在 C# 中创建我的对称密钥

    一直在审查一些对称加密方法 我看到了很多在类中硬编码私有静态变量的示例 通常类似于 string key THISISYOURENCRYPTIONKEY 然后在更远的地方 代码使用它来加密 解密 抛开正确的实现 算法 策略以及存储它的位置
  • 内存高效的随机数迭代器,无需替换

    我觉得这应该很容易 但经过多次搜索和尝试后我找不到答案 基本上 我有大量的物品 我想以随机顺序进行采样 而不需要更换 在本例中 它们是二维数组中的单元 我用于较小数组的解决方案不会转换 因为它需要对内存数组进行改组 如果我必须采样的数量很小
  • rand() 的实现

    我正在用 C 编写一些嵌入式代码 需要使用 rand 函数 不幸的是 控制器的库不支持 rand 我需要一个快速的简单实现 但更重要的是空间开销很小 可以产生相对高质量的随机数 有谁知道使用哪种算法或示例代码 编辑 它用于图像处理 因此 相
  • 正确使用 EncryptedSharedPreferences

    Android 最近发布了 EncryptedSharedPreferences 它自动加密 SharedPreferences 键 值数据 虽然这很好 但我发现我可以简单地连接 API 调用并检索解密的值 除了在调用 EncryptedS
  • python:PyPi公共模块:如何确定是否安全?

    我已经完成了我的 python 3 应用程序 它正在使用 PyPi 的多个公共模块 然而 在我将其部署到我公司的企业 将处理客户的凭据并访问第 3 方 API 之前 我需要尽职调查确保它们既安全又安全 我必须执行哪些步骤 验证 PyPi 模
  • 在 JavaScript 中生成 UUID 时发生冲突

    这涉及到这个问题 https stackoverflow com questions 105034 how to create a guid uuid in javascript 我正在使用下面的代码这个答案 https stackover
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • 计算 RSA 128 位密钥长度需要多长时间? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在网上做了一些研究 似乎表明 RSA 加密的推荐密钥长度是 1024 位 但是我有一个问题 对于今天使用的普通计算机来说 计算 128 位 RSA
  • 在没有默认 java.policy 文件的情况下运行 Java 安全管理器

    我不想修改 java 主目录中的任何内容 但是 我担心有时我的默认 java policy 文件可能过于宽松 当我使用以下命令运行 java 时 有没有办法使用指定的策略文件作为唯一的策略文件 Djava security manager
  • Android - 在sqlite数据库中存储敏感数据

    我需要将敏感数据存储在 Android 应用程序的 sqlite 数据库中 我如何确定这些数据非常安全 我知道我可以使用密钥加密数据 但是我将该密钥存储在哪里 我也不想要求用户填写密钥 我只是希望它能够自行工作 因为我害怕逆向工程 所以我也

随机推荐