如何确定C / C ++中的字符串是否是随机的

时间:2015-05-20 07:08:16

标签: c++ c encryption random statistics

我正在开发一些加密,创建一个加密的字符串 t7AZChkiBA?t7AZDxknCE34F14OuwuXiIcGBIKqSGya03CY9cf9iUSPuCb7owPUzmfTxoBsDzE533S82dvKqm7KmOkREtknHH30z6rLHAHg29COKjX9A6uZxh4fAlrRy

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

4 个答案:

答案 0 :(得分:1)

我认为这个网站有一个香农熵的在线计算器,用于任意字符串,公式和一个非常好的解释将有所帮助:

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

从那个计算器中,你要找的是“度量熵”,它等于香农的恩赐除以字符串长度,它是字符串随机性的度量。它可以取0到1之间的值,其中1表示字符串是随机均匀分布的。

答案 1 :(得分:1)

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

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

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

当然,由于任意位字符串对于随机文本同样可能,因此您只能以一定的置信度显示它不是随机的。

此外,完全可以欺骗随机数测试。密文通过这些测试这一事实并不意味着密码可以承受有针对性的攻击。<​​/ p>

答案 2 :(得分:0)

一种技术 - 使用更长的字符串可以更好地工作 - 将生成一组非常大的随机样本字符串,然后计算它们的一些统计数据,以了解随机输入的平均值和标准偏差,这将使你得到任何给定输入字符串随机的原始百分比几率。将这些测试组合在一起 - 每个测试都使用不同的统计量 - 应该可以为您提供更准确的测试。

至于统计数据可能是什么,它可能取决于您期望的非随机输入类型(例如,您是否需要“保护”以防止用户设计用于欺骗您的程序的非随机输入):

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

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

    < / LI>
  • 计算字符串中后续重复的子序列的频率,可能会反转

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

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

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

答案 3 :(得分:0)

将随机与非随机分离的一种方法是尝试压缩字符串。非随机字符串将压缩多于随机字符串。当然,由良好的加密方法产生的字符串的问题是任何这样的方法设计以输出随机出现的字符串,因此将通过许多随机性测试。即使使用错误的密钥进行解密,仍会提供随机输出。