仿射密码破解代码示例
密文
假设如下是经过仿射密码加密的密文局部
DMLGU DJE CTDERTED JGK ZESMAE GT CTDEQRGH FGRD MX AMLERT KMSCEDCEK FRMFEHHCTQ DJE ETL WKER DM DJE XMREXRMTD MX SMAAWTCSGDCMT GHH OCTLK MX CTXMRAGDCMT CK GPGCHGZHE CT GHH LCXXERETD XMRAGDK GTL MX PGRUCTQ DMFCSK GTL FMCTD MX PCEIK
明文
TODAY THE INTERNET HAS BECOME AN INTEGRAL PART OF MODERN SOCIETIES PROPELLING THE END USER TO THE FOREFRONT OF COMMUNICATION ALL KINDS OF INFORMATION IS AVAILABLE IN ALL DIFFERENT FORMATS AND OF VARYING TOPICS AND POINT OF VIEWS
源码
import java.io.*;
public class MiMa1 {
public static void main(String[] args) throws IOException {
String filePath = "C:\\Users\\51330\\Documents\\WeChat Files\\wxid_9j4asa75m4fd22\\FileStorage\\File\\2021-09\\cipher2.txt";
// String cipher = ReadFile.readTxtFile(filePath);
char[] s = ReadFile.readTxtFile(filePath);
// for(int i=0;i<s.length;i++){
// System.out.print(s[i]);
// }
int[] k1 = { 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25 };
int[] k2 = new int[26];
// int[] k3= k1;
char[] jie = new char[8196];
for (int i = 0; i < 26; i++)
k2[i] = i;
// 解密核心
for (int k1i = 0; k1i < k1.length; k1i++) {
for (int k2i = 0; k2i < k2.length; k2i++) {
// for (int k3i = 0; k3i < k3.length; k3i++) {
for (int i = 0; i < s.length; i++) {
if ((int) s[i] > 90 || (int) s[i] < 65) {
jie[i] = s[i];
} else {
jie[i] = JieMi.jieMi(s[i], k1[k1i], k2[k2i]);//一次仿射
// jie[i] = JieMi.jieMi3(s[i], k1[k1i], k2[k2i],k3[k3i]);//二次仿射
}
}
for (int i = 0; i < 20; i++)
System.out.print(jie[i]);
System.out.println(" "+ k1[k1i] + " " + k2[k2i]);
// + " " + k3[k3i]
if (jie[7] == 'T' && jie[8] == 'H' && jie[9] == 'E') {
WriteFile.writeFile(jie);
System.out.println(" "+ k1[k1i] + " " + k2[k2i]);
}
// }
}
}
}
}
class JieMi {
static char jieMi(char cip, int k1, int k2) {//仿射密码
int ch1 = (int) cip;
ch1 -= 65;
ch1 = (ch1 * k1 + k2) % 26;
ch1 += 65;
char cip1 = (char) ch1;
return cip1;
}
static char jieMi3(char cip,int k1,int k2,int k3){
int ch1 = (int) cip;
ch1 -= 65;
ch1 = (ch1 * k1 + k2 +ch1*ch1*k3) % 26;
ch1 += 65;
char cip1 = (char) ch1;
return cip1;
}
}
class ReadFile {
/**
* 功能:Java读取txt文件的内容 步骤:1:先获得文件句柄 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
* 3:读取到输入流后,需要读取生成字节流 4:一行一行的输出。readline()。 备注:需要考虑的是异常情况
*
* @param filePath
*/
public static char[] readTxtFile(String filePath) {
try {
String encoding = "utf-8";
File file = new File(filePath);
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
char[] s = new char[8196];
// int len = bufferedReader.read(s);
bufferedReader.read(s);
read.close();
return s;
} else {
System.out.println("找不到指定的文件");
return null;
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
return null;
}
}
}
class WriteFile {
static void writeFile(char[] write1) throws IOException {
FileOutputStream f = new FileOutputStream(new File(
"C:\\Users\\51330\\Documents\\WeChat Files\\wxid_9j4asa75m4fd22\\FileStorage\\File\\2021-09\\cipher2_jie1.txt"));
OutputStreamWriter a = new OutputStreamWriter(f, "utf-8");
BufferedWriter writer = new BufferedWriter(a);
String s = new String(write1, 0, write1.length);
writer.write(s);
writer.flush();
}
}