实验二 流密码实验.docx
- 文档编号:22846819
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:11
- 大小:440.12KB
实验二 流密码实验.docx
《实验二 流密码实验.docx》由会员分享,可在线阅读,更多相关《实验二 流密码实验.docx(11页珍藏版)》请在冰豆网上搜索。
实验二流密码实验
深圳大学实验报告
课程名称:
密码学与网络安全
实验项目名称:
流密码实验
学院:
计算机与软件学院
专业:
软件工程
指导教师:
陈飞
报告人:
学号:
班级:
实验时间:
实验报告提交时间:
教务部制
实验目的与要求:
1、理解流密码的基本思想
2、理解RC4流密码算法的原理
3、掌握RC4流密码的输入输出格式和密钥格式
4、掌握RC4流密码的加解密过程和实现方法
实验环境:
SimpleISES客户端
MicrosoftCLRDebugger2005或其它调试器
实验原理:
RC4是1987年RonRivest为RSA公司设计的一种流密码,是一个面向字节操作、具有密钥长度可变特性的流密码,是目前为数不多的公开的流密码算法。
目前的RC4至少使用128位的密钥。
RC4的算法可简单描述为:
对于n位长的字,有共N=2n个可能的内部置换状态矢量S=S[0],S[1],…,S[N-1],这些状态是保密的。
密钥流K由S中的2n个元素按一定方式选出一个元素而生成,每生成一个密钥值,S中的元素就重新置换一次,自始至终置换后的S包含从0到N-1的所有n比特数。
RC4有两个主要算法:
密钥调度算法KSA和伪随机数生成算法PRGA。
KSA算法的作用是将一个随机密钥变换成一个初始置换,及相当于初始化状态矢量S,然后PRGA利用KSA生成的初始置换生成一个伪随机数出序列。
密钥调度算法KSA的算法描述如下:
fori=0toN-1do
S[i]=i;
K[i]=K[imodL];
j=0;
fori=0toN-1do
j=(j+S[i]+K[i])modN;
swap(S[i],S[j]);
初始化时,S中元素的值被设置为0到N-1,密钥长度为L个字节,从S[0]到S[N-1]对于每个S[i]根据有密钥K确定的方案,将S[i]置换为S中的另一个元素。
伪随机数生成算法PRGA的算法描述如下:
i=0;
j=0;
while(true)
i=(i+1)modN;
j=(j+S[i])modN;
swap(S[i],S[j]);
t=(S[i]+S[j])modN
outputk=S[t];
PRGA算法主要完成密钥流的生成,从S[0]到S[N-1],对每个S[i],根据当前S的值,将S[i]与S中的另一个元素置换,当S[N-1]完成置换后,操作再从S[0]开始重复。
加密时将K值与下一个明文字节异或;解密时将K值与下一密文字节异或。
实验内容:
1、通过SimpleISES客户端演示RC4算法的加解密计算
2、采用自己熟悉的编程语言实现RC4密码算法
实验步骤与结果:
1.已脱离实验室环境无法截图
2.RC4算法的实验
代码如下:
/**
*RC4加密算法从命令行参数读取文件名加密再解密
*/
importjava.io.*;
importjava.util.Date;
publicclassRC4{
privatestaticfinalintLENGTH_OF_S=256;
privatestaticfinalStringKEY="123";
privatestaticint[]S=newint[LENGTH_OF_S];//S盒子
/***
*快速交换函数
*
*@parama交换的第一个数
*@paramb交换的第二个数
*/
privatestaticvoidswap(inta,intb){
a=a^b;
b=a^b;
a=a^b;
}
/***
*根据密钥来生产加密盒子S
*
*@paramK密钥
*/
privatestaticvoidinitS(StringK){
intj=0;
int[]T=newint[LENGTH_OF_S];
/*S的初始化*/
for(inti=0;i S[i]=i; T[i]=(int)K.charAt(i%K.length()); } /*S的初始置换*/ for(inti=0;i j=(j+S[i]+T[i])%LENGTH_OF_S; swap(S[i],S[j]); } } /*** *加密和解密文本型文件 * *@paramP密文或者明文 *@return明文或者密文 */ privatestaticStringcodeTheString(StringP){ inti=0,j=0,l=0,t=0,tmp=0; chark; StringBuilderK=newStringBuilder(); while(l i=(i+1)%LENGTH_OF_S; j=(j+S[i])%LENGTH_OF_S; swap(S[i],S[j]); t=(S[i]+S[j])%LENGTH_OF_S; tmp=(int)P.charAt(l)^S[t]; k=(char)tmp; K.append(k); l++; } returnK.toString(); } /*** *加密和解密二进制文件 * *@paramP密文或者明文 *@return明文或者密文 */ privatestaticStringcodeTheFile(StringP){ inti=0,j=0,l=0; intt; bytetmp; byte[]p=P.getBytes(); byte[]k=newbyte[p.length]; while(l i=(i+1)%LENGTH_OF_S; j=(j+S[i])%LENGTH_OF_S; swap(S[i],S[j]); t=(S[i]+S[j])%LENGTH_OF_S; tmp=(byte)(P.charAt(l)^S[t]); k[l]=tmp; l++; } returnnewString(k); } /*** *主函数将命令行第一个参数作为文件名,加密该文件并生成密文文件和解密文件。 * *@paramargs命令行参数 */ publicstaticvoidmain(String[]args){ if(args.length==0){ System.out.println("您调用main方法时没有指定任何参数! "); return; } initS(KEY);//初始化S; Filehere=newFile("./"); StringfileName=args[0]; Filefile=null; Stringpath=null; /*获取当前路径和明文文件*/ try{ path=here.getCanonicalPath(); file=newFile(path+'/'+fileName); if(! file.exists()){ System.out.println("文件不存在! "); return; } }catch(IOExceptione){ e.printStackTrace(); } /*获取密文文件和解密文件*/ File_file=newFile(path+'/'+fileName+"-outM"); File__file=newFile(path+'/'+fileName+"-outP"); try{ if(! _file.createNewFile()||! __file.createNewFile()){ System.out.println("检测到文件已经存在,将覆盖内容"); } }catch(IOExceptione){ e.printStackTrace(); } try{ assertfile! =null; BufferedReaderpReader=newBufferedReader(newFileReader(file));//明文输入字符流 BufferedWritermWriter=newBufferedWriter(newFileWriter(_file));//密文输出字符流 BufferedReadermReader=newBufferedReader(newFileReader(_file));//密文输入字符流 BufferedWriterppWriter=newBufferedWriter(newFileWriter(__file));//密文输出字节流 StringBuilderfileBufferP=newStringBuilder(); StringBuilderfileBufferPP=newStringBuilder(); /*加密过程*/ intc; while((c=pReader.read())! =-1){ fileBufferP.append((char)c); } longbeginOfEncode=newDate().getTime(); StringM=codeTheString(fileBufferP.toString());//生成密文 longendOfEncode=newDate().getTime(); mWriter.write(M);//写入密文文件 mWriter.flush(); mWriter.close(); /*解密过程*/ while((c=mReader.read())! =-1){ fileBufferPP.append((char)c); } longbeginOfDecode=newDate().getTime(); StringP=codeTheString(fileBufferPP.toString());//生成明文 longendOfDecode=newDate().getTime(); ppWriter.write(P);//写入解密文件 ppWriter.flush(); ppWriter.close(); pReader.close(); mReader.close(); System.out.println("加密共消耗"+(double)(endOfEncode-beginOfEncode)/1000.0+"s."); System.out.println("解密共消耗"+(double)(endOfDecode-beginOfDecode)/1000.0+"s."); }catch(IOExceptione){ e.printStackTrace(); } } } 效果演示: 设置命令行参数为1 文件1 运行程序 因为1-outM和1-outP已经于先前生成将覆盖 文件1-outM 文件1-outP 实验结论: 加密速度为11.5Mbit/0.373s=30.83Mbit/S 解密速度为11.5Mbit/0.189s=60.84Mbit/S 平均速度为23Mbit/(0.373s+0.189s)=40.93Mbit/s 经过研究只用codeTheString函数和字符流只能加密文本因为我用String序列化了这些字节所以加密二进制文件的时候会出错 然而使用codeTheFile函数和字节流能加密二进制文件,但是在加密文本型文档的时候将会丢失编码信息,导致英文和数字能正常显示,中文变成了乱码 因此分开使用了两个函数和字节流 指导教师批阅意见: 成绩评定: 指导教师签字: 年月日 备注: 注: 1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 流密码实验 实验 密码