实验二 流密码实验Word文件下载.docx
《实验二 流密码实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验二 流密码实验Word文件下载.docx(11页珍藏版)》请在冰点文库上搜索。
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;
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;
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;
}
*根据密钥来生产加密盒子S
*
*@paramK密钥
privatestaticvoidinitS(StringK){
intj=0;
int[]T=newint[LENGTH_OF_S];
/*S的初始化*/
for(inti=0;
i<
LENGTH_OF_S;
i++){
S[i]=i;
T[i]=(int)K.charAt(i%K.length());
/*S的初始置换*/
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<
P.length()){
i=(i+1)%LENGTH_OF_S;
j=(j+S[i])%LENGTH_OF_S;
t=(S[i]+S[j])%LENGTH_OF_S;
tmp=(int)P.charAt(l)^S[t];
k=(char)tmp;
K.append(k);
l++;
returnK.toString();
*加密和解密二进制文件
privatestaticStringcodeTheFile(StringP){
inti=0,j=0,l=0;
intt;
bytetmp;
byte[]p=P.getBytes();
byte[]k=newbyte[p.length];
p.length){
tmp=(byte)(P.charAt(l)^S[t]);
k[l]=tmp;
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()){
文件不存在!
}catch(IOExceptione){
e.printStackTrace();
/*获取密文文件和解密文件*/
File_file=newFile(path+'
+fileName+"
-outM"
File__file=newFile(path+'
-outP"
_file.createNewFile()||!
__file.createNewFile()){
检测到文件已经存在,将覆盖内容"
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())!
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();
加密共消耗"
+(double)(endOfEncode-beginOfEncode)/1000.0+"
s."
解密共消耗"
+(double)(endOfDecode-beginOfDecode)/1000.0+"
}
效果演示:
设置命令行参数为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日内。