【问题标题】:Unpredictable pseudo-RNG不可预测的伪RNG
【发布时间】:2013-12-18 12:57:15
【问题描述】:

我正在为学校使用 C++ 进行密码学项目,我需要一种方法来生成其他人(谁“猜到”了种子)无法重新生成的随机数。
准确地说,我需要一个纯随机生成器,或者一种获得 100%“安全”种子的方法。我已经做了一些研究和思考,我找到了两种方法可以做到这一点,第一种方法是用当前时间初始化种子,但这让我担心“黑客”可能会发现密钥生成的时刻,然后他们将拥有种子,因此将能够预测下一个生成的数字。我发现的第二种方法是向用户询问种子。
现在,如果我不希望用户生成密钥怎么办?我对基于时间的种子的担忧是成立还是纯粹的偏执狂?有没有人可以获得代码的执行时刻?或者还有其他我错过的方法吗?
旁注:我正在使用来自<random>random_default_engine

【问题讨论】:

  • 您可以要求用户输入一些内容,然后将其中的内容用作您的种子。另外,请检查::std::random_device
  • 使用系统时间是一个弱种子,因为知道消息何时被加密的攻击者可以很容易地使用该时间段内窗口中的每个时间戳进行暴力攻击——比如说,在半个他们认为事情发生的时间。为伪 RNG 生成熵的问题是一个非常活跃的研究领域。应该有很多文章和研究论文描述您考虑过的不同方法的优缺点。
  • 你不知道,但你的问题涉及到宇宙中最大的难题之一!是否存在任何真正随机的东西??! (我不这么认为,但有些人认为是的,他们有很好的论据)。我认为您对这篇文章感兴趣:engineering.mit.edu/ask/…
  • @user1095108 我已经考虑过这样做,我实际上认为这是最好的答案,特别是感谢另一个答案,它说 is 可以破解它轻松
  • @qwrrty 谢谢,我只是向用户询问种子(或者我会添加一种生成种子的方法,但我会告诉用户它不安全)

标签: c++ random rsa


【解决方案1】:

user1095108 的想法是对的,但评论可能太短了。

让用户随机输入一些内容。每个字符大约有 1 位随机性。用户在选择随机字符方面非常糟糕。但是,您需要大约 40-50 位。

但是,用户也不擅长以准确的节奏打字。每次击键的计时会增加一些额外的随机性,具体取决于您的操作系统报告的准确度。使用毫秒分辨率,10 次击键就足够了。

【讨论】:

  • 有趣。我如何计算击键时间? random_device 似乎也符合我的需求,但我很确定它也有缺点(例如,如果没有获取所需随机信息的方法,它就无法在系统上运行)
  • 基本上不在可移植 C++ 中。标准输入是面向行的。
  • 所以我必须为每个操作系统编写不同的函数,我希望程序可以在上面运行。有没有其他方法可以从用户输入中生成一些东西?另外,我刚查了一下,我的电脑不支持真正的RNG,所以我必须这样编码。
  • @Rudy132:Qt 是一个可移植的库,它支持单独的按键事件。可能有点矫枉过正,但它也为您提供了一个不错的 GUI。
  • 是的,我知道 Qt,但由于这是一个学校项目,我宁愿避免在其中包含外部库:/
猜你喜欢
  • 2013-02-27
  • 2021-01-05
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 2011-04-13
  • 2017-09-09
相关资源
最近更新 更多