Kaiser密码小程序

概念:

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。

程序功能:

1.加密密码
2.解密密码
3.破译密码

数学思路:

1、先将明文字母转换为ASCII码,小写字母97-122,大写字母65-90。再将其减去97或65,即可得到0-25之间的数字
2、根据加密或解密的公式解密。再用类似的方法把0-25之间的数字转化为字母
3、破译时尝试密钥为0-25之间的所有的数字,从结果中挑选出有意义的即为明文。

package com.qul.java1;

import java.util.Scanner;

/**
 * @author Dxkstart
 * @create 2021-05-18 12:57
 */
public class Kaiser {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("1.*****加密*****");//encrpt
        System.out.println("2.*****解密*****");//decrpt
        System.out.println("3.*****破译*****");//decode
        System.out.println("4.*****退出*****");
        boolean b = true;
        while(b){
            System.out.println("请选择功能:");
            int num = scanner.nextInt();

            switch (num) {
                case 1:
                    new Encrpt().encrpt();
                break;
                case 2:
                    new Decrpt().decrpt();
                break;
                case 3:
                    new Cryptanalysis().decode();
                break;
                case 4:
                    b = false;
            }
        }
    }
}

//加密算法
class Encrpt {
    String cleartext;//明文
    int key;

    public void encrpt() {
        Scanner scanner = new Scanner(System.in);
        //输入key值
        System.out.println("请输入key:");
        key = scanner.nextInt();
        //输入明文
        System.out.println("请输入明文(小写字符):");
        cleartext = scanner.next();
        System.out.println("密文为:");
        //进行加密
        char[] chars = cleartext.toCharArray();//String转char数组
        for (int i = 0; i < chars.length; i++) {
            int q = (int) chars[i];//转ACSll码
            if(q >= 97 && q <= 122){
                int j = (q - 97 + key % 26) % 26 + 97 - 32;
                char s = (char)j;
                System.out.print(s);
            }else{
                throw new RuntimeException("明文请输入小写!");//输入格式不正确的话,抛出异常
            }
        }
        System.out.println();
    }

}

//解密算法
class Decrpt {
    String ciphertext;//密文
    int key;

    public void decrpt() {
        Scanner scanner = new Scanner(System.in);
        //输入key值
        System.out.println("请输入key:");
        key = scanner.nextInt();
        //输入密文
        System.out.println("请输入密文(大写字符):");
        ciphertext = scanner.next();
        System.out.println("明文为:");
        //进行解密
        char[] chars = ciphertext.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int q = (int) chars[i];//转ACSll码
            if(q >= 65 && q <= 90){
                int j = (q - 65 + 26 - key % 26) % 26 + 65 + 32;
                char s = (char)j;
                System.out.print(s);
            }else{
                throw new RuntimeException("密文,请输入大写!");//输入格式不正确的话,抛出异常
            }
        }
        System.out.println();
    }

}

//破译算法
class Cryptanalysis {
    String ciphertext;//密文
    int key ;

    public void decode() {
        Scanner scanner = new Scanner(System.in);
        //输入密文
        System.out.println("请输入要破译的密文(大写字符):");
        ciphertext = scanner.next();
        System.out.println("破译结果:");
        //进行破译
        char[] chars = ciphertext.toCharArray();
        for (key = 1; key < 26; key++) {
            for (int i = 0; i < chars.length; i++) {
                int q = (int) chars[i];//转ACSll码
                if(q >= 65 && q <= 90){
                    int j = (q - 65 + 26 - key) % 26 + 65 + 32;
                    char s = (char)j;
                    System.out.print(s);
                }else{
                    throw new RuntimeException("密文,请输入大写!");//输入格式不正确的话,抛出异常
                }
            }
            System.out.println();
        }
        System.out.println();
    }

}



破译结果为:attack攻击