1、 JAVA面向对象编程课程设计论文 凯撒加密解密程序 学生姓名: 赵 席 兵 学生学号: 200710802050 院(系): 计算机学院 年级专业: 07信息与计算科学 2010-12-14 摘要 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。例如,如果字母的位数是3,明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就
2、是凯撒密码加密和解密的密钥。 关键字: 凯撒密码 加密 解密 目录 第一节 4 第二节 4 第三节 5 参考文献 12 第一节 实例说明 凯撒密码是罗马扩张时期朱利斯•凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动2位,则字母A将变为C,字母B将变为D,…,字母X变成Z,字母Y则变为A,字母Z变为B。因此,假如有个明文字符串“Hello”用这种方法加密的话,将变为密文:“Jgnnq”。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq”每个字母左移
3、两位变为“Hello”。这里,移动的位数“2”是加密和解密所用的密钥。 第二节 编程思路 首先获取要加密的内容以及密钥,凯撒密码的密钥即字符移动的位数。由于凯撒密码器的移位是针对字符的,因此需要将待加密的内容中每个字符取出,然后针对每个字符分别加以移位。主要步骤如下: (1) 读取要加密的字符串、密钥 String s=args[0]; int key=Integer.parseInt(args[1]); 分析:作为示例,程序中通过命令行参数传入要加密的字符串。凯撒密码器的密钥比较简单,只是移动的位数,这里不妨通过命令行参数传入。由于移动的位数为整数,因此使用Integer
4、parseInt( )方法进行了转换。
(2) 取出字符串中每个字符
for(int i=0;i
5、多少位。 尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。因此移位后使用两个if语句判断一下,如果向左超界(c<'a')则增加26;向右超界(c>'z')则减去26。 此外由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。 第三节 代码与分析 源程序: import java.io.*; public class Caesar{ public static String path; public static String e
6、str="";
public static char c;
public static void Encode(String str,int n){
for(int i=0;i
7、<='Z') estr+=(char)(c+n%26); else estr+=(char)('A'+((n-('Z'-c)-1)%26));
else if(c>='0'&&c<='9')
if(c+n%10<='9') estr+=(char)(c+n%10); else estr+=(char)('0'+((n-('9'-c)-1)%10));
else estr+=c;
}
}
public static void Decode(String str,int n){
for (int i = 0; i 8、); i++) {
c=str.charAt(i);
if (c>= 'a'&&c<='z')
if(c-n%26>='a') estr+=(char)(c-n%26); else estr+=(char)('z'-(n-(c-'a')-1)%26);
else if(c>='A'&&c<='Z')
if(c-n%26>='A') estr+=(char)(c-n%26); else estr+=(char)('Z'-(n-(c-'A')-1)%26);
else if(c>='0'&&c<='9')
9、 if(c-n%10>='0') estr+=(char)(c-n%10); else estr+=(char)('9'-(n-(c-'0')-1)%10);
else estr+=c;
}
}
public static void main(String args[]){
String array = "";
int num;
System.out.println("---凯撒密码---");
System.out.println("(仅支持英文和阿拉伯数字--zhaoxibing)");
10、try {
System.out.println("1、加密");
System.out.println("2、解密");
System.out.println("3、暴力破解");
System.out.print("请选择:");
BufferedReader input_ed = new BufferedReader(new InputStreamReader(System.in));
String ed=input_ed.readLine();
if(ed.equals("1")||ed. 11、equals("2")||ed.equals("3")){
System.out.print("文件路径(*.txt):");
BufferedReader input_path = new BufferedReader(new InputStreamReader(System.in));
path=input_path.readLine();
File file = new File(path);
FileInputStream rdf = new FileInputStream(file);
12、 byte[] s = new byte[rdf.available()];
int b = rdf.available();
while((b=rdf.read(s, 0, b))!=-1){
String content = new String(s,0,b);
array = array+content;
}
rdf.close();
if(ed.equals("3")){
for(int k=1;k<=25;k++){
Decode(ar 13、ray,k);
System.out.println("密钥为"+k+"时,结果是"+estr);
estr="";
if(k>=10){
for(int j=1;j<=9;j++){Decode(array,k+26*j);System.out.println("密钥为"+(k+26*j)+"时,结果为"+estr);estr="";}
}
}
System.out.print("正确的密钥为(整数):");
BufferedReader 14、input_result = new BufferedReader(new InputStreamReader(System.in));
int result=Integer.valueOf(input_result.readLine()).intValue();
Decode(array,result);
}else{
System.out.print("密钥(整数):");
BufferedReader input_num = new BufferedReader(new InputStreamRead 15、er(System.in));
num=Integer.valueOf(input_num.readLine()).intValue();
if(ed.equals("1"))
Encode(array,num);
else
Decode(array,num);
}
File f=new File(path);
FileWriter outFile=new FileWriter(f);
BufferedWriter bufferOut=new BufferedWrit 16、er(outFile);
bufferOut.write(estr);
bufferOut.newLine();
bufferOut.flush();
bufferOut.close();
System.out.print("请查看原文件是否已成功加密或者解密。");
}else System.out.print("您输入有误。");
}catch(Exception e){System.out.print("输入错误。");}
}
}
该程序既可用于加密又可用于解密,还可以对密文暴力破解。
17、
即
只要运行1—加密程序,输入:
Caesar 明文(要加密的字符串)路径,密钥(移动的位数)
即可加密。
在密钥前面加上负号,将运行
Caesar 明文(要加密的字符串)路径 -密钥(反向移动的位数)
即可解密。运行2—解密程序,输入:
Caesar 明文(要加密的字符串)路径,密钥(移动的位数),也可解密。
如为了加密字符串“I love you more than I can say!”,该字符串位于D:\jiami.txt中。可随意取一个密钥如5,运行:
1(即加密程序) D:\jiami.txt 5
即
原文档字符串将变为“N qtaj dtz r 18、twj ymfs N hfs xfd!”。这里“I love you more than I can say!”是明文,“N qtaj dtz rtwj ymfs N hfs xfd!”是密文。
如果密钥大于26,程序中移位前会和26取模而将其调整到26以下。因此运行:
1(即加密程序) D:\jiami.txt 31
同样将输出“N qtaj dtz rtwj ymfs N hfs xfd!”。
为了将密文“N qtaj dtz rtwj ymfs N hfs xfd!”解密,需要知道加密该密文所用的密钥5,这样,执行:
1(即加密程序) D:\jiami.txt -5
19、将得到明文“I love you more than I can say!”。
如果密钥和加密时所用的不同,则解密时将得到无意义的输出,如运行
1(即加密程序) D:\jiami.txt -4
即
原文档将变为“E hkra ukq ikna pdwj E ywj owu!”。这样,只有知道密钥才能得到原来的密文。
解密一般运行2—程序解密,
2(即解密程序) D:\jiami.txt 5
即
就会将原来加密后的“N qtaj dtz rtwj ymfs N hfs xfd!”字符串解密成“I love you more than I can say!” ,即原 20、来的明文。
如果不知道原文的密钥,可运行3—暴力破解。如知道密文为“N qtaj dtz rtwj ymfs N hfs xfd!”
运行
3(暴力破解) D:\jiami.txt
得到如下界面
即最简单的密钥为5。
将密文“N qtaj dtz rtwj ymfs N hfs xfd!”转换为“I love you more than I can say!”
参考文献:
[1] 嘉兴高专 《计算机时代》 1997年11期
[2] 高炯 英文参考文献著录若干问题讨论[J] 辽宁行政学院院报 200810(5)
[3] 王锡林,郭庆平,程胜利 《计算机安全》 人民邮电邮版社
[4] 杨义先,林晓东,刑育森 信息安全综论 北京邮电大学
[5] 章照止,杨义先,马晓敏 信息理论密码学的新进展及研究问题 《电子学报》
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818