一、项目设计目标与要求
1.利用凯撒密码的加密方法编写算法;
1.1、根据对凯撒密码的介绍,自己创建明文信息,编写相应密码算法的实现程序,实现加密和解密操作。(编程语言自选)
1.2、提取出要加密的字符串、密钥,将字符串中毎个字符都取出并进行移位,以实现加密和解密的功能。
2.利用CAP4运算软件比较结果;
2.2、与CAP4的运算结果进行比较,验证你的实验结果是否正确。
密码是实现秘密通讯的主要手段,是隐蔽语言、文字、图象的特种符号。凡是用特种符号按照通讯双方约定的方法把电文的原形隐蔽起来,不为第三者所识别的通讯方式称为密码通讯。在计算机通讯中,采用密码技术将信息隐蔽起来,再将隐蔽后的信息传输出去,使信息在传输过程中即使被窃取或载获,窃取者也不能了解信息的内容,从而保证信息传输的安全。
二、项目设计内容
2.1、凯撒密码:凯撒密码是罗马扩张时期朱利斯·凯撒( Julius Caesar)创造的,用于加密通过信使传递的作战命令。加密的过程是将字母表中的字母移动一定位置,从而实现文本的加密。如果将字母表中的字母向右移动2位,则字母A将变为C,字母B将变为D,以此类推,一个明文字符串Hello就被加密成Jgnnq。之后解密,就会返回原字符串。这里,移动的位数2是加密和解密所用的密钥。
2.2、利用凯撒密码设计加密算法:
我们用java代码来实现一个简单的加密算法:
package kaisa1;
public class Kaisapwd {
public static void main(String[] args) {
char str[]= {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’,
‘k’,‘l’,‘m’,‘n’,‘o’,‘p’,‘q’,‘r’,‘s’,‘t’,‘u’,‘v’,‘w’,‘x’,‘y’,‘z’};
for(char out:str) {
System.out.print(out+" “);
}
for(int i=0;i<26;i++) {
if(i<23) {
str[i]+=3;
}else {
str[i]-=23;
}
}
System.out.println(”\n");
for(char out:str) {
System.out.print(out+" ");
}
}
}
我们输入字母表,下面按照后移三位的密钥输出结果:
2.3、利用凯撒密码设计解密算法:
package kaisa1;
public class Kaisapwdoff {
public static void main(String[] args) {
char str[]= {‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’,‘k’,‘l’,
‘m’,‘n’,‘o’,‘p’,‘q’,‘r’,‘s’,‘t’,‘u’,‘v’,
‘w’,‘x’,‘y’,‘z’,‘a’,‘b’,‘c’};
for(char out:str) {
System.out.print(out+" “);
}
for(int i=0;i<26;i++) {
if(i<23) {
str[i]-=3;
}else {
str[i]+=23;
}
}
System.out.println(”\n");
for(char out:str) {
System.out.print(out+" ");
}
}
}
2.4、利用CAP4的运算结果进行比较,验证你的实验结果是否正确:
三、项目设计过程
1.需求分析
我们需要实现两个步骤:第一是通过算法实现凯撒密码的加密与解密;
第二是用CAP4来验证我们输入输出是否正确。
3.主要实验步骤与技术分析
3.1 编写算法(基于凯撒密码)
package kaisa1;
import java.util.Scanner;
public class Kaisaonoff {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(“欢迎使用凯撒密码加密解密器!!”);
System.out.println(“A.加密,B.解密,请选择一个”);
//创建Scanner对象
Scanner c=new Scanner(System.in);
//获取字符串
String s1=c.nextLine();
//判断变量s1与A是否相等,忽略大小
if(s1.equalsIgnoreCase(“A”)) {
System.out.println("请输入明文:");
//获取输入的内容
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
//输入需要往后推算的位数(比如:3==》表示往后推算三位)
System.out.println("请输入密钥:");
Scanner sc1=new Scanner(System.in);
//将下一输入项转换成整型
int key=sc1.nextInt();
//调用加密算法
Encryption(s,key);
}else if(s1.equalsIgnoreCase("B")) {
System.out.println("请输入密文:");
//获取输入的内容
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
//输入加密时往后推算的位数(比如:3==》表示往后推算三位)
System.out.println("请输入密钥:");
Scanner sc1=new Scanner(System.in);
int key=sc1.nextInt();
//调用解密算法
Decrypt(s,key);
}
}
//解密算法
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='a'&&c<='z')
{
//移动key%26位
c+=k%26;
if(c<'a')
//向左超界
c+=26;
if(c>'z')
//向右超界
c-=26;
//如果字符串中的某个字符是大写字母
}else if(c>='A'&&c<='Z')
{
//移动key%26位
c+=k%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='a'&&c<='z')
{
//移动key%26位
c+=k%26;
if(c<'a')
//向左超界
c+=26;
if(c>'z')
//向右超界
c-=26;
//如果字符串中的某个字符是大写字母
}else if(c>='A'&&c<='Z')
{
//移动key%26位
c+=k%26;
if(c<'A')
//向左超界
c+=26;
if(c>'Z')
//向右超界
c-=26;
}
//将解密后的字符连成字符串
string +=c;
}
System.out.println(str+" 加密后为:"+string);
}
}
(2)首先完成明文的加密(我们用i have a dream that one day这个明文来进行测试):
(3)密钥表示往后推的位数,得到加密后的结果:l kdyh d guhdp wkdw rqh gdb(我们这里选择3位):
3.3 CAP4测试
(1)打开软件:
(2)我们在上面的方框中输入需要测试的明文数据(i have a dream that one day),然后选择Cipers,在下拉框中选择simper shift:
(3)调出一个对话框,框中输入密钥,也就是后移的位数,在点击加密按钮(Encipher):
在下面加密好的密文框中我们可以看到结果是:lkdyhdguhdpwkdwrqhgdb,与我们之前代码得到的结果一致。
四、项目设计总结
通过此次实验,我学会了基本的通过凯撒密码实现信息加密的方法,了解了密码是实现秘密通讯的主要手段,是隐蔽语言、文字、图象的特种符号。凡是用特种符号按照通讯双方约定的方法把电文的原形隐蔽起来,不为第三者所识别的通讯方式称为密码通讯。在计算机通讯中,采用密码技术将信息隐蔽起来,再将隐蔽后的信息传输出去,使信息在传输过程中即使被窃取或载获,窃取者也不能了解信息的内容,从而保证信息传输的安全。
在实验中我使用JAVA代码编写了一个完整的凯撒密码加密和解密的算法,要求提取出要加密的字符串、密钥,将字符串中毎个字符都取出并进行移位,以实现加密和解密的功能算法得出的测试结果与CAP4软件结果比对一致。
通过这个实验我也进一步提高了动手能力,在实验中也重新复习了java的一些性质和简单的算法,实践出真知。