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

}
  •  

编译结果如下图所示:
加密:

å¨è¿éæå¥å¾çæè¿°
解密:

å¨è¿éæå¥å¾çæè¿°
运行结果如下图所示:
加密:

å¨è¿éæå¥å¾çæè¿°
解密:

å¨è¿éæå¥å¾çæè¿°

Guess you like

Origin blog.csdn.net/shan1774965666/article/details/105682628