凯撒密码是罗马扩张时期朱丽斯·凯撒创造的,用于加密通过信使传递的作战命令。加密的过程是将字母表中的字母移动一定,从而实现文本的加密。如果将字母表中的字母向右移动2位,则字母A将变为C,字母B将变为D,以此类推,一个明文字符串Hello就被加密成Jgnnq。之后解密,就会返回原字符串。这里,移动的位数2是加密和解密所用的密钥。
凯撒密码的技术要点:
提取出要加密的字符串、密钥‘
将字符串中每个字符都取出并进行移位。
package corejava;
import java.util.Scanner;
/**
* 密码:凯撒密码
* */
public class TestCaesar {
public static void main(String[] args) {
System.out.println("[A 加密][J 解密],Please Choose One");
Scanner c=new Scanner(System.in);//创建Scanner键盘输入对象
String s1=c.nextLine();//获取本行的字符串
if(s1.equalsIgnoreCase("A")){
System.out.println("请输入明文:");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
System.out.println("请输入密钥:");
Scanner sc1=new Scanner(System.in);
int key=sc1.nextInt();//将下一个输入项转换成int类型
Encryption(s, key);
}else if(s1.equalsIgnoreCase("J")){
System.out.println("请输入密文:");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
System.out.println("请输入密钥:");
Scanner sc1=new Scanner(System.in);
int key=sc1.nextInt();//将下一个输入项转换成int类型
Decrypt(s, key);//調用解密方法
}
}
public static void Encryption(String str,int k){//加密
String string="";
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if(c>='a'&&c<='z'){//如果字符串中的某个字符是小写字母
c+=k%26;//移动key%26;
if(c<'a')
c+=26;
if(c>'z')
c-=26;
}else if(c>='A'&&c<='Z'){//如果字符串中的某个字符是大写字母
c+=k%26;//移动key%26;
if(c<'A')
c+=26;
if(c>'Z')
c-=26;
}
string+=c;//将加密后的字符串连成字符串
}
System.out.println(str+" 加密后为: "+string);
}
public static void Decrypt(String str,int n){//解密
int k=Integer.parseInt("-"+n);
String string="";
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if(c>='a'&&c<='z'){//如果字符串中的某个字符是小写字母
c+=k%26;//移动key%26;
if(c<'a')
c+=26;
if(c>'z')
c-=26;
}else if(c>='A'&&c<='Z'){//如果字符串中的某个字符是大写字母
c+=k%26;//移动key%26;
if(c<'A')
c+=26;
if(c>'Z')
c-=26;
}
string+=c;//将解密后的字符串连成字符串
}
System.out.println(str+" 加密后为: "+string);
}
}
注意:
字母表中共有26个字符,在移位前先将移动的位数Key和26取模。JAVA将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。
尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或者左移仍然嫩发生超界。如字母x右移4位应该是是字母b,但是将字母x增加4后超出26个字母的范围,当然此时的密码仍然可能有意义(没有超出ASC码表的范围),此处明文被表示成是其他的ASC码。该例子只是把明文表示成26个字母,所以此时要增加两个if语句判断一下,如果向左超界(c<'a')则增加26;如果向右超界(c>'z')则减去26。同时由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。