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

基于字母频率的文本解密

东方文林
2023-03-14

我有一个关于获取加密文本文件内容并根据给定频率列表交换相应字母的快速问题。

例如,文本文件中的前几行是:

XWJGFVCCVUJYPXQZGCVXQHXKAZGPPUHBZJYPUFMCZVYXQWJFZJCCMVMGHWZBZXQZKKBKUBKAZGJY

我创建了一个单个字符的数组列表,然后在哈希集中找到每个字母在文件中出现的次数。

A: 6
B: 35
C: 30
D: 21
F: 31
G: 38
H: 16
I: 1
J: 61
K: 53
L: 16
M: 26
N: 7
O: 3
P: 33
Q: 61
R: 10
S: 8
U: 21
V: 37
W: 23
X: 67
Y: 36
Z: 80
import java.io.*;
import java.util.*;

public class lab9 {

  lab9() {

    try {

      String content = new Scanner(new File("Cipher.txt")).useDelimiter("\\Z").next();
      String letters = content.replaceAll("\\W", "");

      System.out.println(letters);

      List < String > list = new ArrayList < String > (Arrays.asList(letters.split("")));

      Set < String > unique = new HashSet < String > (list);
      for (String key: unique) {
        System.out.println(key + ": " + Collections.frequency(list, key));
      }

      String decipher = "ETAHOSINRDBLMWGUCYFJKVPXQZ";
      List < String > list2 = new ArrayList < String > (Arrays.asList(decipher.split("")));

      System.out.println(decipher);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

在代码片段中,您可以看到字符串解密,它是英语中最常用的字母列表,按降序排列。因此,我想将文本文件中的字母Z与E交换。这样做的有效方式是什么?

共有2个答案

栾鸣
2023-03-14

按降序对ArrayList进行排序。创建字典/哈希表,其中键=字母,值=该字母在ArrayList中的索引位置。

从开头逐个字符(charRead)读取加密文本,并将每个字母替换为decipher[Hashtable[charRead]]

您需要将上面的伪代码更改为Java

商燕七
2023-03-14

一种方法是将字母频率对封装在Java对象中,表示字母频率。然后,您将为这些对象实现一个比较器,以便根据频率对它们进行排序。对于一个预先构建的实际字母频率列表,你也会做同样的事情,留下两个排序列表。

从这一点来看,一个有效的解决方案是在加密和解密的字母之间创建一个哈希映射,然后迭代字符串,用正确的值替换每个字符。这将给你一个“解密”版本的消息,尽管除非你有一个更大的加密文本体来处理,否则在这种仅基于频率的直接翻译中可能会有一些错误。

在自定义对象上创建比较器有一个很好的答案:按属性排序自定义对象的数组列表

 类似资料:
  • 我想破译基于频率分析的文本,编程不是问题,但有一些数学困难。 (别担心,不是为了黑客攻击,我想试试十二宫杀手340密码,但问题只是关于破译http://zodiackillerciphers.com/wiki/images/7/7d/340-cipher-hi-resolution.jpg的一般问题,而不是密码的其他问题。) 我已经把它分解为5个简短的问题,都与成本函数有关,以表明我的努力,简短的

  • 问题内容: 这是来自pyschools的问题。 我确实做对了,但我猜测会有一个更简单的方法。这是最简单的方法吗? 看起来应该像这样: 问题答案: 在2.7+中: 较早的版本(2.5或更高版本,到目前为止):

  • 本文向大家介绍统计输入字符各个字母出现频率的解题思路,包括了统计输入字符各个字母出现频率的解题思路的使用技巧和注意事项,需要的朋友参考一下 本文跟大家分享的是编写一个程序,能够计算输入字符各个字母出现的频率,具体如下  先跟大家展示一下最终结果: 刚刚接手题目的时候,我想得很复杂,因为26个字母中有大小写嘛,小写a~z,大写A~Z 但是,无论是大写还是小写,字母都只有26个,在此,当输入大写字母的

  • 让我们假设我有一个这样的结构化数组: 我将这个结构称为“categories”,所以,我在这个数组中有六个类别。我的目标是根据一个类别随机挑选一个产品。 我想做一个基于速率的类别选择,据我所知,我必须计算这个类别在数组中代表多少百分比,例如: 这会给我类似的东西: 好的,现在我要做一个简单的算法,根据这些比率得到类别;我想我现在需要在范围之间选择一个随机数,并制作一些“切片”,例如: 如果随机数介

  • 我有一个,它以字符、整数的形式存储密文块中每个字母的频率。然后按最频繁的降序将地图排序为。 然后,我将这些频率与已知的字母频率列表进行比较,以尝试猜测密码字母是什么。我遇到的问题是,如果两个或多个字母出现的次数相同。 例如,如果我们采取以下措施: 密码文本中最常见的5个字母是desc,然后是字母频率: 然后可以公平地假设映射到,因为它是最常见的,其次是映射到等等。 如果字母频率为: 还不清楚、还是