JAVA——一个简单的加密和解密程序(凯撒密码)
一个简单的加密和解密程序(凯撒密码)
1.凯撒密码
凯撒密码是罗马扩张时期朱利斯·凯撒( Julius Caesar)创造的,用于加密通过信使传递的作战命令。加密的过程是将字母表中的字母移动一定位置,从而实现文本的加密。如果将字母表中的字母向右移动2位,则字母A将变为C,字母B将变为D,以此类推,一个明文字符串Hello就被加密成Jgnq。之后解密,就会返回原字符串。这里,移动的位数2是加密和解密所用的**。
2.要求
提取出要加密的字符串、**,将字符串中毎个字符都取出并进行移位,以实现加密和解密的功能。
3.原理
- 字母表中共有26个字符,在移位前先将移动的位数(key)和26取模。Java将字符加上个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。
- 尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。因此移位后使用两个if语句判断一下,如果向左超界(c<’a’)则增加26;如果向右超界(c>’z’)则减去26。此外,由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。
4.代码
import java.util.Scanner;
public class rw35 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("[A 加密][J 解密],请选择一个");
Scanner c=new Scanner(System.in);// 创建Scanner对象
String s1=c.nextLine();//获取本行的字符串
if(s1.equalsIgnoreCase("A")) {//判断变量s1与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);//调用Encryption方法
}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();
Decrypt(s,key);//调用Encryption方法
}
}
public static void Decrypt(String str, int n) {
// TODO Auto-generated method stub
//解密
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);
}
public static void Encryption(String str, int k) {
// TODO Auto-generated method stub
//加密
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);
}
}
5.结果
编译结果如下图所示:
加密:
解密:
运行结果如下图所示:
加密:
解密: