基本仿射密码破解

仿射密码破解代码示例

密文

假设如下是经过仿射密码加密的密文局部

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();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值