收藏 分销(赏)

java课程设计——凯撒加密解密程序.doc

上传人:pc****0 文档编号:7729172 上传时间:2025-01-14 格式:DOC 页数:14 大小:294.50KB
下载 相关 举报
java课程设计——凯撒加密解密程序.doc_第1页
第1页 / 共14页
java课程设计——凯撒加密解密程序.doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述
JAVA面向对象编程课程设计论文 凯撒加密解密程序 学生姓名: 赵 席 兵 学生学号: 200710802050 院(系): 计算机学院 年级专业: 07信息与计算科学 2010-12-14 摘要 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。例如,如果字母的位数是3,明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就是凯撒密码加密和解密的密钥。 关键字: 凯撒密码 加密 解密 目录 第一节 4 第二节 4 第三节 5 参考文献 12 第一节 实例说明 凯撒密码是罗马扩张时期朱利斯•凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动2位,则字母A将变为C,字母B将变为D,…,字母X变成Z,字母Y则变为A,字母Z变为B。因此,假如有个明文字符串“Hello”用这种方法加密的话,将变为密文:“Jgnnq”。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq”每个字母左移两位变为“Hello”。这里,移动的位数“2”是加密和解密所用的密钥。 第二节 编程思路 首先获取要加密的内容以及密钥,凯撒密码的密钥即字符移动的位数。由于凯撒密码器的移位是针对字符的,因此需要将待加密的内容中每个字符取出,然后针对每个字符分别加以移位。主要步骤如下: (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。 此外由于大写字母和小写字母判断是否超界的依据不同,程序中将字符分为大写和小写分别处理。 第三节 代码与分析 源程序: import java.io.*; public class Caesar{ public static String path; public static String estr=""; public static char c; public static void Encode(String str,int n){ for(int i=0;i<str.length();i++){ c=str.charAt(i); if(c>='a'&&c<='z') if(c+n%26<='z') estr+=(char)(c+n%26); else estr+=(char)('a'+((n-('z'-c)-1)%26)); else if(c>='A'&&c<='Z') if(c+n%26<='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 <str.length(); 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') 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)"); 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.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); 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(array,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 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 InputStreamReader(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 BufferedWriter(outFile); bufferOut.write(estr); bufferOut.newLine(); bufferOut.flush(); bufferOut.close(); System.out.print("请查看原文件是否已成功加密或者解密。"); }else System.out.print("您输入有误。"); }catch(Exception e){System.out.print("输入错误。");} } } 该程序既可用于加密又可用于解密,还可以对密文暴力破解。 即 只要运行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 rtwj 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 将得到明文“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!” ,即原来的明文。 如果不知道原文的密钥,可运行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] 章照止,杨义先,马晓敏 信息理论密码学的新进展及研究问题 《电子学报》
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服