Java 凯撒密码

概要:

凯撒密码是罗马扩张时期朱利斯・凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。加密的过程是将字母表中的字母移动一定位置,从而实现文本的加密。如果将字母表中的字母向右移动2位,则字母A将变为C,字母B将变为D,以此类推,一个明文字符串Hello就被加密成Jgnnq。之后解密,就会返回原字符串。这里,移动的位数2是加密和解密所用的密钥。

| |目录

技术要点

凯撒密码的技术要点如下:

  • 提取出要加密的字符串、密钥。

  • 将字符串中每个字符都取出并进行移位。

代码实现

package net.xsoftlab.baike;
import java.util.Scanner;
public class Caesar {
	public static void main(String args[]) throws Exception {
		System.out.println("[A 加密][J 解密],Please Choose One");
		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 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;
				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;
				if (c < 'A')
					c += 26;// 同上
				if (c > 'Z')
					c -= 26;// 同上
			}
			string += c;// 将解密后的字符连成字符串
		}
		System.out.println(str + " 解密后为:" + string);
	}
}

程序解读

  1. 字母表中共有26个字符,在移位前先将移动的位数(key)和26取模。Java将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。

  2. 尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。因此移位后使用两个if语句判断一下,如果向左超界(c<'a')则增加26;如果向右超界(c>'z')则减去26。此外,由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。所以,对每个字符进行移位,可以通过下面的代码实现:

c+=key%26;
if(c<'a')c+=26;
if(c>'z')c-=26;


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消