【问题标题】:Create permutations of char arrays based on letter frequencies in Java基于 Java 中的字母频率创建 char 数组的排列
【发布时间】:2014-03-17 12:25:00
【问题描述】:

我有一个HashMap,它以字符、整数的形式将每个字母的频率存储在一个密文块中。然后按最频繁的降序将地图排序为LinkedHashMap

然后我将这些频率与已知的字母频率列表进行比较,以尝试猜测密码字母是什么。我遇到的问题是如果 2 个或更多字母出现相同的次数。

例如,如果我们采取:

E T A O I

作为 5 个最常见的字母 desc,然后是密文中的字母频率:

D=30 B=25 I=22 G=19 H=17

那么假设D 映射到E 是公平的,因为它是最常见的,其次是BT 等等。

如果字母频率是:

D=30 B=25 I=22 G=22 H=22

尚不清楚IGH 是否应该映射到A,因为它们都是B 之后最常见的。

我有点卡住了,需要一种方法来创建一组字符数组,其中包含频率列表的每个排列。需要在 char 数组中输出类似的内容:

DBIGH
DBIHG
DBGIH
DBGHI
DBHIG
DBHGI

任何帮助将不胜感激

【问题讨论】:

    标签: java arrays cryptanalysis


    【解决方案1】:

    正如您已经说过的,您需要创建字符串IGH 的每个排列(此处可以将字符串和字符数组作为同义词使用)。 This question 显示了该问题的解决方案。

    要在地图中找到您必须为其创建排列的部分,只需按其频率顺序迭代地图并跟踪相同频率的第一次出现。

    编辑:添加另一个想法来帮助您发表评论。 基本上你可以将你的 26 个字符字符串分成相同频率的组。在上面的示例中,这将是三个组:DBIGH。要创建整个字符串的所有组合,您需要将每个组的所有排列与所有其他组的所有排列组合起来。对于微不足道的单个字符组。但是一旦你得到更多的 3+ 字符组,它就会变成一个很长的列表......

    【讨论】:

    • 如果有不止一组重复怎么办?完整的密钥长度为 26 个字母,通常包含大约 3 个不同的重复分组
    • @JoshRoberts 在上面的答案中添加了更多信息。
    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多