当前位置: 首页 > 知识库问答 >
问题:

文本破译,基于字母频率的方法(关于成本函数的问题)

干宏邈
2023-03-14

我想破译基于频率分析的文本,编程不是问题,但有一些数学困难。

(别担心,不是为了黑客攻击,我想试试十二宫杀手340密码,但问题只是关于破译http://zodiackillerciphers.com/wiki/images/7/7d/340-cipher-hi-resolution.jpg的一般问题,而不是密码的其他问题。)

我已经把它分解为5个简短的问题,都与成本函数有关,以表明我的努力,简短的回答是好的,任何帮助都感谢。我的问题是,成本函数中的值差异非常小。

  1. 包含任意数量符号的文本,从现在起称为密码。密码是英文的。密码中的每个符号只代表一个字母,但一个字母可以通过几个符号来表示。我们不知道是否有空格(但是必须由cost函数计算的字符串将以空格分隔,并且只有字母A-Z)
  2. 字母频率分析(A-Z和空格):单字母、字母对和字母三元组。使用sowpods拼字词典的4000个最常见的英语单词或“所有”单词

关于频率分析的问题:

  1. 只检查最常见的单词还是使用SOWPOD检查所有单词更好(可能删除4000个最常见单词中不包含的2个和3个字母的单词)
  2. 对于字母对和三胞胎:最好只存储它们的频率,还是以P(A | B)(A在A B之后的概率)和P(C | AB)的形式存储

如果不感兴趣就跳过。我不想在这里详述,有几种方法可以使用。一个粗略的草图:

  1. 生成(半)随机解
  2. 基于成本函数的解的局部优化
  3. 重新开始并传授所学知识
  4. 停滞一段时间后,在局部优化之前,尝试在固定位置引入空格(如果消息没有空格)
  5. 比较两个检索到的解决方案,并返回更好的解决方案

成本函数是什么样的?总的来说可以表示为:

w1*字母成本w2*配对成本w3*三重成本w4*单词成本

所有一切的总和是一:

w1 w2 w3 w4=1

关于成本函数的问题

现在,对于忽略单词的简单频率(w4=0),你可以只计算频率并取平方差(这就是我目前正在做的)。我想知道的是:w1=w2=w3或w1=27*w2=27*27*w3更合理吗?

它如何处理条件概率?

你如何整合单词的知识?只要数一数有多少真正的英语单词,可能是根据它们的长度来加权,或者有没有更聪明的方法?

共有1个答案

鞠建安
2023-03-14

依我看,你的问题来自过于笼统的概念。如果你不精确计算算法,就不可能计算出代价函数。我可以提出一种方法,来实现你概念的第二点:

  1. 计算随机的期望值(例如:如果你有100000个字母,随机三胞胎应该出现5次)
  2. 设n为加密文本中的字母数。然后为每个字母增加字母[y],对[y][y 1],三元组[y][y 1][y 2]的值
  3. 如果一些数据的出现明显大于1中计算的值,那么试着判断你离答案有多近。

尽管如此,第3点和“判断”非常笼统,但基于此,我可以给你一些答案:

关于成本函数的问题

  1. 最好只使用最常见的单词,因为它会给你关于随机结果偏差的信息。持有所有单词不会给你带来任何利润。
  2. 频率是我的建议。我找不到保持条件概率的任何用法。

成本函数

在我的例子中,AlgRoTHHM的成本是O(n)const(对于长单词,你可以考虑使用哈希表)“判断”。问题还在继续,因为许多问题取决于“法官”将如何解决。

 类似资料:
  • 我有一个关于获取加密文本文件内容并根据给定频率列表交换相应字母的快速问题。 例如,文本文件中的前几行是: XWJGFVCCVUJYPXQZGCVXQHXKAZGPPUHBZJYPUFMCZVYXQWJFZJCCMVMGHWZBZXQZKKBKUBKAZGJY 我创建了一个单个字符的数组列表,然后在哈希集中找到每个字母在文件中出现的次数。 在代码片段中,您可以看到字符串解密,它是英语中最常用的字母列

  • 我在半年多前开始学习使用Python编程语言。正如Swaroop在本书中所说的那样,它很快就成为“我最喜欢的编程语言”。目前我的几乎所有编程工作都使用Python。从我的切身体会来说,Python最大的特点就是易懂、易用、高效率。我相信,如果你已经学完了本书,并且尝试着编写了一些程序后,你一定会有相同的感受。 Swaroop C. H.的这本书是我学习Python时的第一本教材。它简单明晰,可以在

  • 沈洁元 目前是上海交通大学无线通信研究所的一名硕士研究生。他现在的研究领域主要在多载波CDMA系统的同步、信道估计、多用户检测等方面。Python语言(和Numeric库)是他目前在进行仿真和其他科研工作时使用的主要编程语言。在业余时间,他乐衷于各种FLOSS,如FreeBSD操作系统、PyGTK等等。电影、F1赛车和网球也是他的兴趣爱好。

  • 以下代码片段的输出结果是什么? var a = 'I am a web developer!' var b = a.split('').reverse().join('') console.log(b) 结果 !repoleved bew a ma I 分析与思考 这题其实很简单,自己之前做过还是被坑到了。主要就一个点,split('')和split(' ')的区别,前者会将字符串中的字符全

  • 我试图制作一个简单的基于文本的游戏,在这个游戏中,你在一个由“#”组成的网格周围移动“@”,并试图找到出口。我已经改变了代码,使我更容易使网格更大或更小,而无需添加或删除大量代码,它一直给我这样的输出: 我不知道这是怎么回事!只有一个“@”应该出现:(我只是python的新手,所以如果您有任何改进的建议,请不要犹豫,然后发布它们!提前感谢,

  • 我正在开发一个小应用程序,例如,我得到了一些字符串“MRUGDQ”和一个移位值3。然后我将每个字母向左移动3,结果是“JORDAN”。例如,M将被J取代,R将被O取代,依此类推。 所以现在这就是我想使用的方法,但我想知道这是否有效,我可以改进我的解决方案吗? 我所做的假设: 我假设我的字符串将是大写A到Z字母或小写A到Z字母,因此ascii范围分别为65到90和97到122。 Pesudo代码 >