一个简单的加密和解密程序——凯撒密码

来源:互联网 发布:学生理财 知乎 编辑:程序博客网 时间:2024/06/05 02:42

本节将介绍一个简单的加密和解密程序,通过本实例,读者将了解加密和解密内部的过程和相关概念,消除对加密和解密的神秘感。

实例说明

凯撒密码是罗马扩张时期朱利斯•凯撒(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

原创粉丝点击