【问题标题】:Solving a substitution cipher with python用python解决替换密码
【发布时间】:2011-04-07 20:34:14
【问题描述】:

我知道有人问过类似的问题,但这是小事一桩。

给定一个以替换密码结尾的文本文件,我需要使用 python 对其进行解码。我没有得到任何正确破译单词的例子。这种关系是一对一的,大小写没有区别。此外,标点符号不会改变,空格会留在原处。我不需要代码方面的帮助,就像我需要有关如何在代码中完成此操作的一般概念的帮助一样。我的主要方法包括:

  1. 首先解决 1、2 或 3 个字符的单词来缩小选择范围。
  2. 我可以使用不同大小的英语单词列表进行比较。
  3. 我可以使用字母的频率分布。

有人知道我可以采取的一般方法吗?

【问题讨论】:

  • 这是一个关于密码分析而不是关于编程的问题……既然如此,那就离题了。
  • 不,这是主题。替代密码并不难理解,所以它不是什么抽象的密码学东西。
  • 这真的不是关于密码分析,而是关于有效的编程实现。我认为一对一的替换密码很容易理解。
  • 这不是不理解主题的情况。我想对我来说,问题是关于算法而不是实现它。

标签: python substitution encryption


【解决方案1】:

我会先得到一个英文单词列表以供参考。接下来构建一个可能的 2 和 3 个字母单词的列表。然后开始测试密码中的那些小单词。一旦你猜到一个小词,就对照你的词表检查较大的词。如果列表中的某些单词不再有可能的完成,那么您就走错了路。如果一个单词只有一个可能的完成,接受它为正确并继续。最终,您要么找到所有单词都在您的英语单词列表中的解决方案,要么您将到达一个单词没有解决方案的地步。

【讨论】:

  • 这正是我需要做的。谢谢你这样说。我认为这主要是我需要的。
【解决方案2】:

Haley's 的演讲全是乱码时,我写了这样的东西。但这不是自动的。它根据etaoinshrdlu(英语中最常用的字母,从高到低排序)进行猜测,并让用户交互地更改给定密文字母的含义。

所以它会告诉你类似的东西:

t0is is a 12eat 34556e!

你会手动猜测每个数字代表什么字母,直到你有一些清晰的东西。

这种方法的优点是它可以容忍拼写错误。如果您的加密器出现任何错误(或在明文中使用字典中没有的任何单词),您可能会发现自己遇到了一个无法解决的难题。

也就是说,拼写检查器有很多英文单词列表。我将 Debian 的 dictionaries-common 软件包中的那个用于我的 hangman solver

【讨论】:

  • 是的,我正在考虑这样的方法。当程序出错并且不知道回溯时,就会出现真正的问题。
  • @Championcake:我的slapped-together 可以让您更改已经分配的字母(或先分配它们),然后重新进行频率分析猜测位。我想知道我是否还有那个代码。那是 3 或 4 个硬盘驱动器之前...
【解决方案3】:

你可以试试这个方法:

  1. 存储有效单词列表(在字典中)和您的语言的“正常”字母分布(在列表中)。

  2. 计算乱码文本中字母的分布情况。

  3. 将您的乱码分布与正常分布进行比较,并据此对您的文本进行 regarble。

  4. 重复:将所有 26 个字母的数组(rank)设置为浮点数(rank('A')=rank('B')=...=rank('Z')=0.0)

  5. 将生成的文本中的单词与字典中的单词进行比较。如果字典中有一个单词,则提高该单词字母的排名(例如:添加一个标准值,例如 1.0)。换句话说,计算分数(总排名和字典中单词数量的函数)。

  6. 将文本保存到高分表中(如果分数足够高)。

  7. 如果所有单词都在字典中,或者总排名足够高,或者循环执行次数超过 10000 次,则结束。

  8. 如果不是,请随机选择两个字母并互换它们。但是由于分布有偏差,排名高的字母被互换的机会应该更少。

  9. 重复。

  10. 结束:打印高分文本。

过程类似于Simulated Annealing

【讨论】:

    最近更新 更多