RC4加密算法的实现网络平安课程设计.docx
- 文档编号:25328397
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:22
- 大小:63.72KB
RC4加密算法的实现网络平安课程设计.docx
《RC4加密算法的实现网络平安课程设计.docx》由会员分享,可在线阅读,更多相关《RC4加密算法的实现网络平安课程设计.docx(22页珍藏版)》请在冰豆网上搜索。
RC4加密算法的实现网络平安课程设计
枣庄学院
信息科学与工程学院
课程设计任务书
题目:
RC4加密算法的实现
学号:
姓名:
专业:
运算机网络技术
课程:
运算机网络平安教程
指导教师:
职称:
教师
完成时刻:
2021年11月----2021年12月
枣庄学院信息科学与工程学院制
随着信息化的进展,人们在信息传递,数据共享等方面的要求愈来愈高。
但与此同时,数据的保密、个人的隐私爱惜也愈来愈困难,迫令人们不能不采取相应的方法来提高信息的平安性。
在此条件下,加密技术应运而生。
加密作为一把系统平安的钥匙,是实现信息平安的重要手腕之一,正确的利用加密技术能够确保信息的平安。
人们所熟悉的加密技术很多,比如数字签名、版权注册、软盘加密、软件锁等等。
本人的设计思想是利用文件夹的加密来实现对软件或文件的平安加密。
在此设计基础上编写了一个程序,该软件操作简单方便,适用于个人PC上对文件的加密。
用户可自选密钥对重要文件或可执行程序进行加密,避免未授权用户窃密。
本文描述了利用文件夹的加密来实现对文件或程序的爱惜方案。
采纳了“对称式”加密技术即采纳文件逐字节与密码异或方式对文件或可执行程序加密。
选用C++编程语言,设计了一个加密程序,该程序不拘泥于花俏的界面,仅利用了一个简单的对话框,具有简单有效的特点。
在该方案的实现中,由于利用了靠得住的密码学算法,使软件加密的强度大大提高。
二.系统原理:
1.RC4加密算法原理:
RC4加密算法是赫赫有名的三人组中的头号人物RonRivest在1987年设计的密钥长度可变的流加密算法簇。
之因此称其为簇,是由于其核心部份的S-box长度可为任意,但一样为256字节。
该算法的速度能够达到DES加密的10倍左右。
RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部份。
假设S-box长度和密钥长度均为为n。
先来看看算法的初始化部份(用类C伪代码表示):
for(i=0;i s=i; j=0; for(i=0;i { j=(j+s+k)%256; swap(s,s[j]); } 在初始化的进程中,密钥的要紧功能是将S-box搅乱,i确保S-box的每一个元素都得处处置,j保证S-box的搅乱是随机的。 而不同的S-box在通过伪随机子密码生成算法的处置后能够取得不同的子密钥序列,而且,该序列是随机的: i=j=0; while(明文未终止) { ++i%=n; j=(j+s)%n; swap(s,s[j]); sub_k=s((s+s[j])%n); } 取得的子密码sub_k用以和明文进行xor运算,取得密文,解密进程也完全相同。 由于RC4算法加密是采纳的xor,因此,一旦子密钥序列显现了重复,密文就有可能被破解。 关于如何破解xor加密,请参看BruceSchneier的AppliedCryptography一书的节SimpleXOR,在此我就不细说了。 那么,RC4算法生成的子密钥序列是不是会显现重复呢? 通过我的测试,存在部份弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,若是是部份重复,那么可能在不到10万字节内就能够发生重复,因此,推荐在利用RC4算法时,必需对加密密钥进行测试,判定其是不是为弱密钥。 但在2001年就有以色列科学家指出RC4加密算法存在着漏洞,这可能对无线通信网络的平安组成要挟。 以色列魏茨曼研究所和美国思科公司的研究者发觉,在利用“有线等效保密规那么”(WEP)的无线网络中,在特定情形下,人们能够逆转RC4算法的加密进程,获取密钥,从而将己加密的信息解密。 实现这一进程并非复杂,只需要利用一台个人电脑对加密的数据进行分析,通过几个小时的时刻就能够够破译出信息的全数内容。 专家说,这并非表示所有利用RC4算法的软件都容易泄密,但它意味着RC4算法并非像人们原先以为的那样平安。 这一发觉可能促令人们从头设计无线通信网络,而且利用新的加密算法。 三.系统功能分析: 图1: 系统功能图 四.系统实现: 设计的核心部份仍是算法的核心部份,依照des算法的原理,成立相关的变量,和函数,完成对8位字符的加密,解密。 而关于文件的加密与解密只需要在文件的读取时,按加密的位数读取然后挪用算法,加密后保留到一个文件,一直到文件的末尾,从而实现文件的加密。 而解密是加密的逆进程,只要将密钥按反顺序利用即可,算法一致,挪用的函数也都一样。 1.功能要求 (1)设计操作界面;(如图3) 图3 (2)对输入的明文能够进行加解密;(如图4) (3)对指定的文件能够加解密。 (图5) 对文件夹进行解密: (图6) 详细设计 字符加解密数据流图 明文 明文 传输 密文 加密密钥 解密密钥 解密 加密 明文 明文 传输 密文 加密密钥 解密密钥 解密 加密 明文 明文 传输 密文 加密密钥 解密密钥 解密 加密 字符加解密数据流图(7) 一层数据流图(8) 二层数据流图(9) 附录: 源程序代码: RC4算法的实现: voidRC4: : swap(baseType*i,baseType*j) { baseTypetemp; temp=*i; *i=*j; *j=temp; } voidRC4: : s_box(baseType*s,char*key,intkeyLen) { inti=0,j=0; for(i=0;i<256;i++) s[i]=i; for(i=0;i<256;i++) { j=(j+s[i]+key[i%keyLen])%256; swap(&s[i],&s[j]); } } voidRC4: : encryption(char*src,char*key,intkeyLen,intsrcLen) { inti=0,j=0,k=0,index=0; baseTypes[256]; : : memset((void*)s,0,256); s_box(s,key,keyLen); for(i=0;i { ++j%=256; k=(k+s[j])%256; swap(&s[j],&s[k]); index=(s[j]+s[k])%256; src[i]^=s[index]; } } 我写的代码: 字符串解密: char*key=newchar; (key,255); CStringstrKey("",256); ("%s",key); if()) { MessageBox("你尚未输入密钥! ",NULL,MB_OK); return; } char*src=newchar; (src,100); CStringstrSrc("",101); ("%s",strSrc); if()) { MessageBox("请输入你要加密的字符串! ",NULL,MB_OK); return; } (src,key,(int)strlen(key),(int)strlen(src)); (src); 字符串加密: char*key=newchar; (key,255); CStringstrKey("",256); ("%s",key); if()) { MessageBox("你尚未输入密钥! ",NULL,MB_OK); return; } char*src=newchar; (src,100); CStringstrSrc("",101); ("%s",strSrc); if()) { MessageBox("请输入你要加密的字符串! ",NULL,MB_OK); return; } (src,key,(int)strlen(key),(int)strlen(src)); (src); 到上面那部份 打开文件: CStringlpszFilter="textfile(*.txt)|*.txt|Microsoftdoc(*.doc)|*.doc|DataFiles(*.xlc;*.xls)|*.xlc;*.xls|AllFiles(*.*)|*.*||"; CStringreadBuf("",1000); CStringlpszDefExt=".txt"; CStringlpszFileName="*.txt"; char*ch1=newchar; charch[9]; : : memset((void*)ch,0,9); charstr[200]; : : memset((void*)str,0,200); CFileDialog*fileOpen=newCFileDialog(true,lpszDefExt,lpszFileName,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL); if(! fileOpen->DoModal()) { MessageBox("Openfailly! ",NULL,MB_OK); return; } CStringfilePath=fileOpen->GetPathName(); (LPCTSTR(filePath)); 保留文件: CStringlpszFilter="textfile(*.txt)|*.txt|Microsoftdoc(*.doc)|*.doc|DataFiles(*.xlc;*.xls)|*.xlc;*.xls|AllFiles(*.*)|*.*||"; CStringlpszDefExt=".txt"; CStringlpszFileName="*.txt"; CFileDialog*fileSave=newCFileDialog(false,lpszDefExt,lpszFileName,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL); CFilecFile; if(! fileSave->DoModal()) { MessageBox("failed! ",NULL,MB_OK); return; } CArchivear(&cFile,CArchive: : load); CStringfilePath=fileSave->GetPathName(); (filePath); if(LPCTSTR(filePath),CFile: : modeCreate|CFile: : modeWrite)==0) { MessageBox("Openfailly! ",NULL,MB_OK); return; } 文件加密: charkey[256]; : : memset((void*)key,'',256); charch[101]; : : memset((void*)ch,'',101); (key,strlen(key)); CStringkey1; ("%s",key); if()) { MessageBox("你尚未输入密钥! ",NULL,MB_OK); return; } CStringsrcFilePath("",200); (srcFilePath); if()) { MessageBox("你尚未选择源文件",NULL,MB_OK); return; } CFilesrcFile; if(LPCTSTR(srcFilePath),CFile: : modeRead)==0) { MessageBox("源文件打开失败! ",NULL,MB_OK); return; } CArchivesrcAr(&srcFile,CArchive: : load); intfileLen=(); CStringdetFilePath("",200); (detFilePath); if()) { MessageBox("你尚未选择目标文件",NULL,MB_OK); return; } CFiledetFile; if(LPCTSTR(detFilePath),CFile: : modeCreate|CFile: : modeWrite)==0) { MessageBox("目标文件打开失败! ",NULL,MB_OK); return; } CStringlen; ("%d",fileLen); if(fileLen<=100) { ((void*)ch,fileLen); (ch,key,strlen(key),strlen(ch)); ((void*)ch,strlen(ch)); } if(fileLen>100) { intk=0,i=0; k=fileLen/100; for(i=0;i { ((void*)ch,100); (ch,key,strlen(key),100); ((void*)ch,100); } k=fileLen%100; if(k! =0) { ((void*)ch,k); (ch,key,strlen(key),k); ((void*)ch,k); } } MessageBox("恭喜您,加密成功! ",NULL,MB_OK); (); (); 文件解密: charkey[256]; : : memset((void*)key,'',256); charch[101]; : : memset((void*)ch,'',101); (key,strlen(key)); CStringkey1; ("%s",key); if()) { MessageBox("你尚未输入密钥! ",NULL,MB_OK); return; } CStringsrcFilePath("",200); (srcFilePath); if()) { MessageBox("你尚未选择源文件",NULL,MB_OK); return; } CFilesrcFile; if(LPCTSTR(srcFilePath),CFile: : modeRead)==0) { MessageBox("源文件打开失败! ",NULL,MB_OK); return; } CArchivesrcAr(&srcFile,CArchive: : load); intfileLen=(); CStringdetFilePath("",200); (detFilePath); if()) { MessageBox("你尚未选择目标文件",NULL,MB_OK); return; } CFiledetFile; if(LPCTSTR(detFilePath),CFile: : modeCreate|CFile: : modeWrite)==0) { MessageBox("目标文件打开失败! ",NULL,MB_OK); return; } CStringlen; ("%d",fileLen); if(fileLen<=100) { ((void*)ch,fileLen); (ch,key,strlen(key),strlen(ch)); ((void*)ch,strlen(ch)); } if(fileLen>100) { intk=0,i=0; k=fileLen/100; for(i=0;i { ((void*)ch,100); (ch,key,strlen(key),100); ((void*)ch,100); } k=fileLen%100; if(k! =0) { ((void*)ch,k); (ch,key,strlen(key),k); ((void*)ch,k); } } MessageBox("恭喜您,解密成功! ",NULL,MB_OK); (); (); 界面设计: (0,"字符串加密"); (1,"文件加密"); (IDD_PAGE0_DIALOG,GetDlgItem(IDC_TAB1)); (IDD_PAGE1_DIALOG,GetDlgItem(IDC_TAB1)); CRectrect; (&rect); +=20; =4; +=4; =4; (&rect); (&rect); (TRUE); (0); intCurSel; CurSel=(); switch(CurSel) {case0: (TRUE); (FALSE); break; case1: (FALSE); (TRUE); break; case2: (FALSE); (FALSE); break; default: ; } *pResult=0; 五.总结: 提出问题: RC4加密后的的长度是多少(例如MD5的加密后的长度是固定的)? 用RC4加密后的字符串长度和原先的一样吗? 用RC4加密后的字符串中间会可不能显现\0? 用strlen取得的长度必然对吗? 解决问题: 在一些场合,常需要用到一些简单的加密算法,那个地址的RC4就能够够说是最简单的一种。 只要设置一个足够强的密码,就能够够适用于一些超级简单的场合了。 我是用来加密HTTP传送的数据的。 RC4函数(加密/解密) 其实,RC4只有加密,将密文再加密一次,确实是解密了。 GetKey函数 随机字符串产生器,呵呵,为了方便,大多数加密算法都有一个随机密码产生器,我也就附带一个了。 ByteToHex函数 把字节码转为十六进制码,一个字节两个十六进制。 研究发觉,十六进制字符串超级适合在HTTP中传输,Base64中的某些字符会造成转义,挺麻烦的。 HexToByte函数 把十六进制字符串,转为字节码。 效劳器也依照十六进制字符串的形式把数据传回来,那个地址就能够够解码啦。 同时,利用十六进制字符串传输,躲开了传输进程中多国语言的问题。 Encrypt函数 把字符串经RC4加密后,再把密文转为十六进制字符串返回,可直接用于传输。 Decrypt函数 直接密码十六进制字符串密文,再解密,返回字符串明文。 六.心得体会: 课程设计不仅是对已学知识的查验,更是对学生动手能力和综合能力的锻炼。 在咱们小组组长的率领下,和通过全小组同窗的一起尽力,咱们完成了课程设计的任务。 在此期间,咱们温故了课堂上学过的知识,还有查找各类资料,对RC加密算法有了进一步的了解和把握。 平常学习的知识点,感觉已把握,可是通过这次课程设计对自己学过的知识的检阅,发觉很多东西并非是想象的那么简单,做起来的时候仍是会因为粗心大意致使课程设计中显现很多小的错误。 课程设计培育了自己的动手能力,对以前学习的知识起到了好的巩固作用,而且对以后课程学习打下了坚实的基础作用。 通过整个小组成员的尽力也学会了团结与合作,全小组的同窗个个干劲十足,专门好的完成了自己的任务,成功地设计出了咱们的RC加密算法系统。 感谢教师为咱们提供了这次课程设计的机遇。 通过这次课程设计巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计我也明白了很多事理。 它使我知道了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会效劳,从而提高自己的实际动手能力和独立试探的能力。 七.致谢: 在这次课程设计的完成进程中,我取得了许多人的帮忙。 第一我要感谢我的教师在课程设计上给予我的指导、提供给我的支持和帮忙,这是我能顺利完成这次报告的要紧缘故,更重要的是教师帮我解决了许多技术上的难题,让我能把系统做得加倍完善。 在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。 第二,我要感激帮忙过我的同窗,他也为我解决了很多我不太明白的设计上的难题。 同时也感激学院为我提供良好的做课程设计的环境。 最后再一次感激所有在设计中曾经帮忙过我的良师益友和同窗 八.参考文献: [1].第2版.北京: 机械工业出版社,2020 [2]WillianStallings著,孟庆树,王丽娜等译.密码编码学与网络平安.北京: 电子工业出版社,2020 [3]刘文涛.网络平安编程技术与实例.北京: 机械工业出版社2020 [4]MichaelWelschenbach编著,赵振江,连国卿等译.编码密码学——加密方式的C与C++实现,电子工业出版社, [5].第3版.北京: 电子工业出版社 [6]廖成效,朱启逑.数字操纵机床.武汉: 华中科技大学出版社,2003
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RC4 加密算法 实现 网络 平安 课程设计