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攻击