您的位置:首页 > 编程语言 > Java开发

Java安全学习笔记(一)--凯撒密码

2015-12-02 17:15 141 查看
凯撒密码是罗马扩张时期朱丽斯·凯撒创造的,用于加密通过信使传递的作战命令。加密的过程是将字母表中的字母移动一定,从而实现文本的加密。如果将字母表中的字母向右移动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取模。J***A将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。

尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或者左移仍然嫩发生超界。如字母x右移4位应该是是字母b,但是将字母x增加4后超出26个字母的范围,当然此时的密码仍然可能有意义(没有超出ASC码表的范围),此处明文被表示成是其他的ASC码。该例子只是把明文表示成26个字母,所以此时要增加两个if语句判断一下,如果向左超界(c<'a')则增加26;如果向右超界(c>'z')则减去26。同时由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: