1实验成绩《信息安全概论》实验报告实验一古典密码实验专业班级:学号:姓名:完成时间:2016/05/09一、实验目的理解简单加密算法的原理;掌握凯撒密码的原理,完成凯撒密码加解密程序的编写;通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。二、实验内容根据凯撒密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现凯撒加密和解密功能。三、实验环境和开发工具1.Windows7系统2.Eclipse3.JDK1.7四、实验步骤和结果首先获取要加密的内容以及密钥,凯撒密码的密钥即字符移动的位数。由于凯撒密码器的移位是针对字符的,因此需要将待加密的内容中每个字符取出,然后针对每个字符分别加以移位。主要步骤如下:(1)读取要加密的字符串、密钥。(2)取出字符串中每个字符。2使用字符串类的charAt()方法取出每个字符,分别加以移位。(3)对每个字符进行移位。由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。由于Java中字符和整型可自动转换,因此将字符加上一个正整数即代表在字母表中右移多少位。如果移动的位数是负值,则代表在字母表中左移多少位。尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。因此移位后使用两个if语句判断一下,如果向左超界(c'a')则增加26;向右超界(c'z')则减去26。源程序:packageCaesar;importjava.io.*;importjava.util.Scanner;/***@authorSiRuYan*/publicclassCaesar{//声明一些全局变量publicstaticStringpath;publicstaticStringestr=;publicstaticcharc;/***凯撒密码加密方法**@paramstr*@paramn*/publicstaticvoidEncode(Stringstr,intn){for(inti=0;istr.length();i++){c=str.charAt(i);if(c='a'&&c='z')if(c+n%26='z')//移位后的字母不大于小写字母z,直接移位estr+=(char)(c+n%26);else3//移位后的字母大于小写字母z,需要在26个字母之间循环estr+=(char)('a'+((n-('z'-c)-1)%26));elseif(c='A'&&c='Z')if(c+n%26='Z')//移位后的字母不大于大写字母Z,直接移位estr+=(char)(c+n%26);else//移位后的字母大于大写字母z,需要在26个字母之间循环estr+=(char)('A'+((n-('Z'-c)-1)%26));elseif(c='0'&&c='9')//对数字进行加密if(c+n%10='9')estr+=(char)(c+n%10);elseestr+=(char)('0'+((n-('9'-c)-1)%10));elseestr+=c;}}/***凯撒密码解密方法*@paramstr*@paramn*/publicstaticvoidDecode(Stringstr,intn){for(inti=0;istr.length();i++){c=str.charAt(i);if(c='a'&&c='z')if(c-n%26='a')estr+=(char)(c-n%26);elseestr+=(char)('z'-(n-(c-'a')-1)%26);elseif(c='A'&&c='Z')if(c-n%26='A')estr+=(char)(c-n%26);elseestr+=(char)('Z'-(n-(c-'A')-1)%26);elseif(c='0'&&c='9')if(c-n%10='0')estr+=(char)(c-n%10);elseestr+=(char)('9'-(n-(c-'0')-1)%10);elseestr+=c;}}4publicstaticvoidmain(Stringargs[]){Stringarray=;Scannerin=null;intnum;System.out.println(----------------凯撒密码----------------);System.out.println(------只支持英文和阿拉伯数字-BySiRuYan------);try{System.out.println(1、加密\n2、解密\n3、暴力破解);System.out.print(请选择:);in=newScanner(System.in);//读入选择序号Stringed=in.next();if(ed.equals(1)||ed.equals(2)||ed.equals(3)){System.out.print(文件路径(*.txt):);path=in.next();//读入加密文件路径Filefile=newFile(path);//声明文件变量,以便读入指定文件路径下的文件内容FileInputStreamrdf=newFileInputStream(file);//available()(FileInputStream变量)方法返回的实际可读字节数,也就是总大小byte[]s=newbyte[rdf.available()];//System.out.println(文件的大小:+rdf.available());测试语句intb=rdf.available();while((b=rdf.read(s,0,b))!=-1){//将文件内容读入字节数组中Stringcontent=newString(s,0,b);array=array+content;}rdf.close();//关闭输入流if(ed.equals(3)){//3暴力破解for(intk=1;k=25;k++){Decode(array,k);System.out.println(密钥为+k+时,结果是+estr);estr=;if(k=10){for(intj=1;j=9;j++){Decode(array,k+26*j);System.out.println(密钥为+(k+26*j)+时,结果为+estr);estr=;}}}System.out.print(正确的密钥为(整数):);intresult=in.nextInt();Decode(array,result);}else{System.out.print(密钥(整数):);num=in.nextInt();if(ed.equals(1))//1加密5Encode(array,num);else//2解密Decode(array,num);}//最后重新把加密、解密后的内容,借助文件、缓冲区输入流重新写入文件Filef=newFile(path);FileWriteroutFile=newFileWriter(f);BufferedWriterbufferOut=newBufferedWriter(outFile);bufferOut.write(estr);bufferOut.newLine();bufferOut.flush();bufferOut.close();System.out.print(原文件是否已成功加密或解密!);}elseSystem.out.print(您输入有误。);}catch(Exceptione){System.out.print(输入错误。);}}}运行结果(注意实验对文件完成加、解密):密钥为:3。加密前、后结果如下图:6五、实验遇到问题及解决方法问题1:程序起初是在eclipse中运行,现在回归到控制台。Java文件中由于包的存在,使一些方法找不到。删除文件首部的引入的package包即可。问题2:实验的对象范围为大小写字母、数字。开始时,解密方法的实现出现了问题,有时候会出现的解密结果,原因是由于相对偏移量的计算出现问题,后来修改后程序运行正确。问题3:实验中忽略了密钥为负的情况。修改偏移量的计算方法,调试程序得出正确结果。实验心得:通过古典密码实验,我对凯撒密码的原理有了一定的认识,加深了对古典密码体制的了解;通过完成凯撒密码加解密程序的编写,巩固了自己的动手编程能力等。凯撒加密体制相对容易实现,另外在网上参考了一些资料,也开阔了自己的眼界,对密钥加密体制有了基本的认知。