您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验三-RC4算法-20103259-方立春
上海电力学院ShanghaiUniversityofElectricPower实验报告院系名称:计算机科学与技术学院_______课程名称:密码编码学与网络安全_______实验项目名称:RC4算法设计______________班级与班级代码:2010151班_________学生姓名:方立春学号:20103259_____同组同学姓名:邓君刘海涛刘和平庄晓琛马昶杰指导教师:田秀霞_____________实验日期:2012/11/2____________实验一RC4密码算法算法实现一、实验目的理解流密码的概念及相关结构;理解并能够编写基本的流密码体制;熟练应用C++编程实现RC4密码算法体制二、实验内容:编程实现RC4加/解密算法。三、实验原理RC4算法是一种序列密码体制或称流密码体制,其加密密钥和解密密钥相同RC4的密钥长度可变,但为了确保哪去安全强度,目前RC4至少使用128位的密钥用1~256个字节(8~2048位)的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…,S[255],从始至终置换后的S包含从0到255的所有8位数。对于加密和解密,字节K是从S的255个元素中按一种系统化的方式选出的一个元素生成的。每生成一个K的值,S中的元素个体就被重新置换一次。三、实验步骤(包括流程图、功能模块)密钥调度算法(KSA,Key-SchedulingAlgorithm)设置内部状态(s[0],…,s[255])的随机排列。开始时,内部状态中的元素被初始化为0~255,既s[i]=i(i=0,…,255);密钥长度可变,设为L个字节(K[0],…,K[L-1]);L一般为5~32之间,用L个字节不断重复填充,直至得到K[0],…,K[255],用于对内部状态S进行随机化。j=0对i=0,…,255做j=j+S[i]+K[i]mod256互换s[i]与s[j]伪随机生成算法(PRGA,PseudoRandomGenerationAlgorithm)从内部状态中选取一个随机元素作为密钥流中的一个字节,并修改内部状态以便下一次选择。选取过程取决于索引值i和j,它们的初始值均为0。i=0j=0重复下述步骤,直至获得足够长度的密钥流:i=i+1mod256j=j+S[i]mod256互换s[i]与s[j]t=S[i]+S[j]mod256K=S[t]microsoftvisualC++编辑环境下编写DES代码并编译,连接,调试运行正确后保存cpp文件并截图。五、软件使用说明(开发环境、参数使用详细说明、实验结果+相应截图等)开发环境:MicrosoftVisualC++6.0;测试数据:密钥key:其实RC4算法很简单!明文:fanglichun参数使用详细说明:首先双击运行生成的RC4.exe文件;根据.exe文件的提示输入自己设定的密钥和要加密解密的字符进行加解密。实验结果:输入测试数据进行加解密,结果均正确相应测试截图:六、参考资料(书籍或网络文章)密码编码学与网络安全—原理与实践(第五版)百度文库七、实验心得和总结在编写RC4算法的过程中,相比AES和DES算法而言,我觉得思路很清晰,因为RC4算法的实现很简单,就包括KSA(初始化S盒)和PRGA(密钥流的生成)算法的编写,而且课本中也给了一些关键性的代码供我们参考,一看就一目了然。剩下的只是对具体的实现了,其中会用到Swap函数的实现和一些模运算,这都是一些基础的东西,我都能够编程一一实现。RC4算法是流密码的典型代表,通过学习和编写RC4算法,我对流密码的理解也更加的深刻了,流密码的原理如下图所示;很明显,在解密端,密文流与完全相同的密钥流异或运算恢复出明文流。RC4算法其加密密钥和解密密钥相同总之,通过编写RC4算法,是我进一步明白编程时我们一定要有清晰的算法思路,要知道我们自己要干什么,用哪一种的编程思路更好,函数参数应该怎么设置,这都需要一定的技巧。当遇到编写和调试所不能解决的问题时,决不能闭门造车瞎苦恼,一定要积极查阅资料,请教同学老师寻求解决办法,因为你有可能可以找到更好地解决方案。我觉得算法的实现并不是自己一定要把它完全自己编出来,关键还是算法思想,只有掌握了算法思想的精髓,再把编程实现划分为各个小的模块,再编程实现就会简单很八.实验源代码//rc4.cpp#includeiostream.h#includestring.h#includestdio.htypedefunsignedlongULONG;voidswap(unsignedchar*s,unsignedinti,unsignedintj){unsignedchartemp=s[i];s[i]=s[j];s[j]=temp;}voidrc4_init(unsignedchar*s,unsignedchar*key,unsignedlongLen){inti=0,j=0,k[256]={0};for(i=0;i256;i++){s[i]=i;k[i]=key[i%Len];}for(i=0;i256;i++){j=(j+s[i]+k[i])%256;swap(s,i,j);}}voidrc4_crypt(unsignedchar*s,unsignedchar*Data,unsignedlongLen){intx=0,y=0,t=0;unsignedlongi=0;for(i=0;iLen;i++){x=(x+1)%256;y=(y+s[x])%256;t=(s[x]+s[y])%256;swap(s,x,y);Data[i]^=s[t];}}voidmain(){intfunction=1;unsignedchars[256]={0};//S-boxcharkey[256]={其实RC4算法很简单!};charpData[512]={\0};while(true){if(function==1){cout输入要加密的明文:pDataendl;cinpData;ULONGlen=strlen(pData);cout输入加密所用的密钥:keyendl;cout输出密钥的长度:strlen(key)endl;rc4_init(s,(unsignedchar*)key,strlen(key));//初始化rc4_crypt(s,(unsignedchar*)pData,len);//加密cout输出加密后的密文:pDataendl;}elseif(function==2){ULONGlen=strlen(pData);rc4_init(s,(unsignedchar*)key,strlen(key));//初始化rc4_crypt(s,(unsignedchar*)pData,len);//解密cout解密后的明文为:pData;}elseif(function=3){cout退出RC4加解密系统!endl;break;}else{cout请输入正确的命令符:\n;}cout\n;cout输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n;cout请输入命令符:\n;cinfunction;}}
本文标题:实验三-RC4算法-20103259-方立春
链接地址:https://www.777doc.com/doc-1862750 .html