实验二 流密码实验Word文件下载.docx

上传人:b****1 文档编号:409528 上传时间:2023-04-28 格式:DOCX 页数:11 大小:440.12KB
下载 相关 举报
实验二 流密码实验Word文件下载.docx_第1页
第1页 / 共11页
实验二 流密码实验Word文件下载.docx_第2页
第2页 / 共11页
实验二 流密码实验Word文件下载.docx_第3页
第3页 / 共11页
实验二 流密码实验Word文件下载.docx_第4页
第4页 / 共11页
实验二 流密码实验Word文件下载.docx_第5页
第5页 / 共11页
实验二 流密码实验Word文件下载.docx_第6页
第6页 / 共11页
实验二 流密码实验Word文件下载.docx_第7页
第7页 / 共11页
实验二 流密码实验Word文件下载.docx_第8页
第8页 / 共11页
实验二 流密码实验Word文件下载.docx_第9页
第9页 / 共11页
实验二 流密码实验Word文件下载.docx_第10页
第10页 / 共11页
实验二 流密码实验Word文件下载.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验二 流密码实验Word文件下载.docx

《实验二 流密码实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验二 流密码实验Word文件下载.docx(11页珍藏版)》请在冰点文库上搜索。

实验二 流密码实验Word文件下载.docx

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日内。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2