本节将介绍一个简单的加密和解密程序,通过本实例,读者将了解加密和解密内部的过程和相关概念,消除对加密和解密的神秘感。
★ 实例说明
凯撒密码是罗马扩张时期朱利斯•凯撒(Julius Caesar )创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动2 位,则字母A 将变为C ,字母B 将变为D ,… ,字母X 变成Z ,字母Y 则变为A ,字母Z 变为B 。因此,假如有个明文字符串“Hello ”用这种方法加密的话,将变为密文:“Jgnnq ”。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq ”每个字母左移两位变为“Hello ”。这里,移动的位数“2 ”是加密和解密所用的密钥。
本实例通过Java 实现了这一过程,由此可以了解与加密和解密相关的概念。
★ 编程思路
首先获取要加密的内容以及密钥,凯撒密码的密钥即字符移动的位数。由于凯撒密码器的移位是针对字符的,因此需要将待加密的内容中每个字符取出,然后针对每个字符分别加以移位。主要步骤如下:
(1) 读取要加密的字符串、密钥
String s=args[0];
int key=Integer.parseInt(args[1]);
分析:作为示例,程序中通过命令行参数传入要加密的字符串。凯撒密码器的密钥比较简单,只是移动的位数,这里不妨通过命令行参数传入。由于移动的位数为整数,因此使用Integer.parseInt( )方法进行了转换。
(2) 取出字符串中每个字符
for(int i=0;i<s.length( );i++){
char c=s.charAt(i);
分析:这里使用字符串类的 charAt()方法取出每个字符,分别加以移位。
(3) 对每个字符进行移位
c+=key%26;
if(c<'a') c+=26;
if(c>'z') c-=26;
分析:由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。由于Java中字符和整型可自动转换,因此将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。
尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。因此移位后使用两个if语句判断一下,如果向左超界(c<'a' )则增加26;向右超界(c>'z' )则减去26。
此外由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。
★ 代码与分析
public static void main(String args[])
throws Exception{
String s=args[0];
int key=Integer.parseInt(args[1]);
String es="";
for(int i=0;i<s.length( );i++)
{ char c=s.charAt(i);
if(c>='a' && c<='z') // 是小写字母
{ c+=key%26; //移动key%26位
if(c<'a') c+=26; //向左超界
if(c>'z') c-=26; //向右超界
}
else if(c>='A' && c<='Z') // 是大写字母
{ c+=key%26;
if(c<'A') c+=26;
if(c>'Z') c-=26;
}
es+=c;
}
System.out.println(es);
}
该程序既可用于加密又可用于解密。只要执行:
java Caesar 明文(要加密的字符串) 密钥(移动的位数)
即可加密。
在密钥前面加上负号,将运行
java Caesar 明文(要加密的字符串) - 密钥(移动的位数)
即可解密。
如为了加密字符串“Hello World! ”,可随意取一个密钥如4 ,运行:
java Caesar "Hello World!" 4
将输出“Lipps Asvph! ”。这里“Hello World! ”是明文,“Lipps Asvph! ”是密文。
如果密钥大于26 ,程序中移位前会和26 取模而将其调整到26 以下。因此运行:
java Caesar "Hello World!" 30
同样将输出“Lipps Asvph! ”。
为了将密文“Lipps Asvph! ”解密,需要知道加密该密文所用的密钥4 ,这样,执行:
java Caesar "Lipps Asvph!" -4
将得到明文“Hello World! ”。
如果密钥和加密时所用的不同,则解密时将得到无意义的输出,如运行
java Caesar "Lipps Asvph!" –3
程序将输出“Ifmmp Xpsme! ”。这样,只有知道密钥才能得到原来的密文。
转载: http://hi.baidu.com/%B0%A2%C1%C1%D6%AE%C9%F9%BC%BC%CA%F5%B2%A9/blog/item/bcc5f682f48de899f703a60d.html