首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C/C++中判断字符串是否是随机的

如何在C/C++中判断字符串是否是随机的
EN

Stack Overflow用户
提问于 2015-05-20 15:08:16
回答 4查看 1.1K关注 0票数 4

我正在做一些加密工作,可以创建像t7AZChkiBA?t7AZDxknCE34F14OuwuXiIcGBIKqSGya03CY9cf9iUSPuCb7owPUzmfTxoBsDzE533S82dvKqm7KmOkREtknHH30z6rLHAHg29COKjX9A6uZxh4fAlrRy这样的加密字符串

长度不是固定的。我如何才能发现这个字符串是否是随机的,并且没有任何意义?

我没有字典。我试图找到一些统计相关性,但我不知道怎么做。

EN

回答 4

Stack Overflow用户

发布于 2015-05-20 15:24:47

我认为这个网站会有帮助,它有一个关于任意字符串的香农熵的在线计算器,一个公式,以及一个相当好的解释:

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-20 15:27:12

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

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

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

当然,由于任何位字符串对于随机文本的可能性都是一样的,所以您只能以一定的置信度来显示它不是随机的。

此外,完全有可能欺骗随机数测试。密文通过这些测试的事实并不意味着密文能够经受住有针对性的攻击。

票数 1
EN

Stack Overflow用户

发布于 2015-05-20 15:25:58

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

至于统计数据是什么,它可能在一定程度上取决于您期望的非随机输入类型(例如,您是否需要针对旨在欺骗您的程序的用户工程非随机输入进行“保护”):

  • (减去ASCII值)相邻字母之间的平均距离(减去ASCII值)不同范围内的样本数量(例如,将A-Za-z0-9分成10个范围,看看每个范围内的#字符是否与随机输入所需的字符一样均匀)
  • 计算字符串后面任何子序列重复的频率,可能颠倒字典单词的
  • 计数,可能具有最小长度以避免噪声代码<

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30342641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档