【问题标题】:How to find out if a string is random in C/C++如何在 C/C++ 中判断一个字符串是否是随机的
【发布时间】:2015-08-01 06:51:17
【问题描述】:

我正在研究一些加密女巫创建一个加密字符串,例如 t7AZChkiBA?t7AZDxknCE34F14OuwuXiIcGBIKqSGya03CY9cf9iUSPuCb7owPUzmfTxoBsDzE533S82dvKqm7KmOkREtknHH30z6rLHAHg29COKjX9A6uZxh4fAlrRy

长度不固定。我怎样才能找到这个字符串是随机的并且不代表什么?
我没有字典。我试图找到一些统计相关性,但我不知道该怎么做。

【问题讨论】:

  • 这可能会有所帮助:random.org/analysis 它包含指向随机性测试的链接。
  • 如果你从一个程序中得到这个字符串,根据定义它永远不会是随机的......它通过解密具有意义
  • @Eregrith:除非它从真随机数生成器中获取数据。但是出于加密目的,通常会发现特定于平台的随机数生成器具有足够的不确定性,可以在 AES 等环境中有效使用,SecureRandom 就是其中之一。
  • @Eregrith:我不理解你的观点:程序可以提供有意义的随机输出(基于来自鼠标移动、网络摄像头传感器、有效不可预测的时间等的熵),而这些数据没有意义,而且无法解密,因为它不是任何东西的加密。
  • @Tony D:在生成随机数时使用传感器数据可能会很有帮助,但你不能使用任何传感器。根据其分辨率和采样率,您的随机数可能不是那么随机,您将在随机数据中引入一种模式。

标签: c++ c encryption random statistics


【解决方案1】:

我认为这个网站,它有一个任意字符串的香农熵在线计算器、一个公式和一个很好的解释会有所帮助:

http://www.shannonentropy.netmark.pl/

从该计算器中,您正在寻找的是“度量熵”,它等于香农的熵除以字符串长度,它是字符串随机性的度量。它可以取 0 到 1 之间的值,其中 1 表示字符串是均匀分布的随机数。

【讨论】:

    【解决方案2】:

    一种对较长字符串效果更好的技术是生成一组非常大的随机样本字符串,然后计算它们的一些统计数据以了解随机输入的平均值和标准偏差,这将使您得到任何给定输入字符串 not 随机的粗略百分比机会。将这些测试组合在一起——每个测试都使用不同的统计数据——应该会给你一个更准确的测试。

    至于统计数据可能是什么,它可能取决于您期望什么样的非随机输入(例如,您是否需要“保护”免受旨在欺骗您的程序的用户工程非随机输入):

    • 相邻字母之间的平均“距离”(减去 ASCII 值)

    • 不同范围内的样本数(例如,将 A-Za-z0-9 分成 10 个范围,看看每个范围中的 # 字符是否与随机输入一样均匀)

    • 计算任何子序列在字符串后面重复的频率,可能是颠倒的

    • 字典单词的数量,可能有最小长度以避免噪音

    • 检查大写字母、小写辅音、小写元音、数字是否与输入格式中此类字符的数量大致成比例(例如,如果您有 52 个字符和 10 个数字 = 62 个可能的字符值,您会期望小写元音平均为字符串长度的 5/62,并且可以计算标准偏差来告诉您更高/更低值的重要性

    • 检查传入字符中特定位的设置频率

    【讨论】:

      【解决方案3】:

      字符串不是随机位串。它似乎完全由某种字母表中的字符组成。不过,这些字符可能是某种完全随机输入集的一部分。

      要真正测试随机性,您需要将密文转换为位串。然后获取 NIST 或德国 BSI 定义的测试应用程序之一来测试随机性并使用位串作为输入。

      要确定它不是随机的,您可以运行频率分析或确定密文上的汉明距离是否与 0.5 显着不同。如果我仔细查看您的随机文本,很可能其中一项测试失败了。尽管还有许多其他测试,但您只需要一个失败的测试即可表明它不是随机的。

      当然,由于任何位串对于随机文本的可能性都相同,因此您只能以一定程度的信心表明它不是随机的。

      此外,完全有可能欺骗随机数测试。密文通过了这些测试并不意味着该密文完全可以抵御针对性攻击。

      【讨论】:

        【解决方案4】:

        将随机与非随机分开的一种方法是尝试压缩字符串。非随机字符串将比随机字符串压缩更多。当然,由良好加密方法生成的字符串的问题在于,任何此类方法都设计来输出看似随机的字符串,因此将通过许多随机性测试。即使使用错误的密钥解密仍然会给出随机输出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 2011-02-05
          • 1970-01-01
          • 2010-11-14
          相关资源
          最近更新 更多