一款经典加密解密教学演示软件的开发毕业设计.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流一款经典加密解密教学演示软件的开发毕业设计.精品文档. 题 目 一款经典加密解密教学演示软件的开发 学生姓名 汤阳 学号 1318042022 所在学院 数学与计算机科学学院 专业班级 计算机科学与技术计专升本1301班 指导教师 李军 _ 完成地点 陕西理工学院 2015 年 6 月 4 日本科毕业设计任务书院(系) 数学与计算机科学学院 专业班级 计算机科学与技术(专升本1301) 学生姓名 汤阳 一、毕业设计题目 一款经典加密解密教学演示软件的开发 二、毕业设计工作自 2014 年 12 月 9 日 起至 2015 年 6 月 20 日止三、毕业设计进行地点: 陕西理工学院 四、毕业设计应完成内容及相关要求: 单码、多码以及多图加密技术在经典密码学中占据着及其重要的地位,也是现代密码学的基础。要求设计一个演示软件,在该软件中能够用经典密码密码学中的几个典型的加密解密算法对文本进行加密与解密。要求实现的功能: 1、实现仿射加密与解密 2、实现多文字加密与解密 3、实现Vigenere密与解密 4、实现Hill加密与解密 五、毕业设计应收集资料及参考文献:1、搜集关于经典密码学相关资料; 2、收集教学演示软件开发的案例及相关经验。 六、毕业设计的进度安排:至 2015-3-20 搜集文献材料,撰写开题报告 2015-3-20 至 2015-3-31 进行设计分析,确定设计方案 2015-4-01 至 2015-4-15 概要设计,构思设计平台的整体框架 2015-4-16 至 2015-5-15 详细设计、搭建平台,编写代码 2015-5-15 至 2015-5-25 软件测试、系统完善 2015-5-26 至 2015-6-05 撰写毕业设计说明书 2015-6-06 至 2015-6-10 整理资料、准备答辩及答辩 2015-6-11 至 2015-6-20 资料完善工作 指导教师签名 专业负责人签名 学院领导签名 批准日期 一款经典加密解密教学演示软件的开发汤阳(陕西理工学院数学与计算机科学学院计算机科学与技术计专升本1301班,陕西 汉中 723000)指导教师:李 军【摘要】为了在密码学教学过程中形象的展示加密解密这一过程,设计实现了一款经典加密解密教学演示软件。该软件基于Microsoft Visual C+ 6.0集成开发环境,采用C+面向对象程序设计方法,根据经典密码学中的单码加密、多码加密以及多图加密算法,实现了经典密码学中的仿射加密法、多文字加密法、Vigenere加密法和Hill加密法四种经典加密算法的教学演示效果。【关键词】仿射加密法;多文字加密法;Vigenere加密法;Hill加密法The Development of A Classical Encryption And Decryption Demo Software For TeachingTangYang(Grade 13, Upgraded Class 1, Major Computer Science and Technology, School of Mathematics and Computer Science .Shaanxi University of Technology, Hanzhong 723000, Shaanxi)Tutor: LI JunAbstract: In order to show the process of encrypt and decrypt in the teaching of classical cryptography, A teaching demo software of a classical encryption and decryption was developed. According to the single code and multiple code encryption algorithm of classical cryptography, Using object-oriented programming method, implementation of the affine encryption method, multiple text encryption method, Vigenere encryption method and Hill encryption method in Microsoft Visual C+ 6.0.Key words: Affine method; More text method; Vigenere method; Hill method目 录1课题实施的背景12仿射加密法22.1 算法概述22.2 算法分析22.3核心代码23 多文字加密法43.1 算法概述43.2 算法分析43.3 核心代码44 VIGENERE加密法74.1 算法概述74.2 算法分析84.3 核心代码85 HILL加密法125.1 算法概述125.2 算法分析135.3 核心代码136系统测试176.1仿射加密算法测试176.2多文字加密算法测试176.3 Vigenere加密算法测试196.4 Hill加密算法测试19总 结21致 谢22参考文献23科技外文文献24附录A: 系统使用说明书451课题实施的背景随着网络技术的发展,大量的数据需要在网络上进行传输,因此,信息安全受到了越来越广泛的关注。近年来,我国数据窃取事件层出不穷,CSDN、珍爱网、世纪佳缘、走秀等多家网站的用户数据库被曝光在网络上,由于部分密码以明文方式显示,导致大量网民的个人信息泄露。继 CSDN、 天涯社区用户数据泄露后,互联网行业一片人心惶惶,而在用户数据最为重要的电商领域,也不断传出用户信息漏洞,漏洞报告平台乌云发布漏洞报告称,支付宝用户大量泄露,被用于网络营销,泄露总量达1200万2300万之多。天猫商城、支付宝和当当网也已被卷入其中。事实上,选择一种合适的加密机制将能消除消费者的各种信息安全隐患。从古典密码学的研究到现代密码学的发展,密码学在我们生活中扮演着越来越重要的角色。但由于密码学是神秘而富有冒险色彩的,它不仅仅是计算机科学的内容,因此,学习密码学必须具有宽广的知识背景。加之,密码学是一个很抽象的东西,不容易理解,所以,学习经典密码学对于初学者来说具有一定的困难与挑战,如果有一套介绍加密解密算法的软件将抽象转换为形象,这势必要减少大量学习理解密码学知识的时间。因此,本课题开发和研究的意义在于能形象生动的展示出经典密码学中单码、多码以及多图加密技术的加密和解密过程,有助于加强初学者对经典密码学的理解。2仿射加密法2.1 算法概述经典单码加密法的一个形式称为仿射加密法。在传统仿射加密法中,字母表的字母被赋予一个数字,仿射加密法的密钥为025之间的数字对(m,n),m与26的最大公约数必须为1。现在,假设p为明文字母的数字(译注:即该字母在字母表中对应的数字),c为密文字母的数字,m-1为m的乘法的逆元,n-1为n的加法的逆元,那么,这两个数字之间的关系可以用如下等式表示:由于传统的仿射加密算法只对26个字母进行加密,为了解决这一局限,对一般符号也能进行加密,从而采用ASCII码表作为加密参考,将模改为95(注:ASCII码值有128个,由于前33个为不可显示字符,因此在加密的过程中排除,故将模改为95)。因此,明文字母的数字p与密文字母的数字c之间的关系可表示为:2.2 算法分析仿射加密法与单码加密替换没有什么不同,因为明文的每个字母分别只映射到一个密文字母。例如,选取密钥为(2,7)。(由于2与95的最大公约数为1,即GCD(2,95)=1,则2可以作为密钥中的a)。因此,利用这个密钥,字“tangyang”可以使用放射加密法加密。将“tangyang”转换成数字116、97、110、103、121、97、110、103,利用放射加密等式生成:c(t)=(2×(116-32)+7)mod 95)+32=112,即为数字“p”c(a)=(2×(97-32)+7)mod 95)+32=74,即为字母“J”c(n)=(2×(110-32)+7)mod 95)+32=100,即为字母“d” c(g)=(2×(103-32)+7)mod 95)+32=86,即为字母“v” C(y)=(2×(121-32)+7)mod95)+32=122,即为字母“z”注:由于ASCII码表中前33个为不可显示字符,因此在加密运算过程中明文字母p要先减去32(ASCII码表中从0开始),求完模之后的结果再加上32,这样,对于(2,7)这个密钥,“tangyang”加密后变成了“pJdvzJdv”。计算可得(95i+1)/a=a-1,将“pJdvzJdv”转换成数字112、74、100、86、122、74、100、86利用放射解密等式生成:c(P)=(48×(112-32)-7)mod 95)+32=116,即为字母“t”c(J)=(48×(74-32)-7)mod 95) +32=97,即为字母“a”c(d)=(48×(100-32)-7)mod 95) +32=110,即为字母“n” c(v)=(48×(86-32)-7)mod 95) +32=103,即为字母“g” c(z)=(48×(122-32)-7)mod 95) +32=110,即为字母“y”这样,对于(2,7)这个密钥,“pJdvzJdv”解密后变成了“tangyang”2.3核心代码/加密函数CString CFCpasswd:FCAddPass(CString newText,int a,int b)int N,i;char mida,c;N = newText.GetLength();Passwd = new charN;char *m_a = newText.GetBuffer(newText.GetLength(); /将字符串转换成字符数组newText.ReleaseBuffer(newText.GetLength();for (i = 0;i < newText.GetLength();i+)mida = m_ai - 32;c = (a * mida + b) % 95;Passwdi = c + 32;Passwdi = '0'newText.Format("%s",Passwd);return newText;int CFCpasswd:getFa(int a) /求a逆int i,n;for (i = 1; i < 95;i+)n = 95 * i + 1;if (n % a) = 0)return n/a;return -1;CString CFCpasswd:FCRelessPass(CString oldText,int a,int b)int N,i,m_b;char p,mida;int fa = getFa(a);if(fa = -1) return ""N = oldText.GetLength();obvious = new charN;char *m_a = oldText.GetBuffer(oldText.GetLength();oldText.ReleaseBuffer(N);for(i = 0; i < N;i+)mida = m_ai - 32;m_b = mida - b;while (m_b < 0)m_b = m_b + 95;p = (fa * m_b) % 95;obviousi = p + 32;obviousi = '0'oldText.Format("%s",obvious);return oldText;3 多文字加密法3.1 算法概述多文字加密法是另一种脆弱的单码加密法,但是它与一般的单码加密法又有一些不同。因为它是用一对字母来替代每个明文字母,加密后的密文是明文的两倍大。多文字加密法的密钥是一个5×5的矩阵。这个矩阵的5行和5列用含有5个字母的关键词来标识,该关键词不能有重复的字母。字母表的每个字母填写在这个矩阵中。当然,矩阵只有25个位置,而字母表有26个字母,因此字母“i”和“j”占同一个单元,这就意味着所有的“j”都变成了“i”。例如,如果关键词为takes,那么密钥矩阵为:表3.1 密文、明文对照表takestabcdeafghikklmnopeqrstusvwxyz每个明文由标识该字母的行和列的字母对替代,加密过程为查找标识该字母的行和列的字母对的过程。解密过程则为反向查找矩阵的过程。3.2 算法分析在关键词为takes,明文为tangyang的情况下,加密解密过程如下:加密过程:密文“ee”替代了明文的“t”,密文“tt”替代了明文的“a”,以此类推,明文“tangyang”加密后的密文为”ee tt kk aa se tt kk aa”。明文“t”替代了密文的“ee”,明文“a”替代了密文的“tt”,以此类推,密文“ee tt kk aa se tt kk aa ”解密后的明文为“tangyang”。3.3 核心代码/加密函数CString CMoreWordPasswd:MWAddPass(CString newText,CString passKey)int textLen = newText.GetLength();CString result;int flag; /状态标志,1表示明文字符在字母表范围之内,0表示不在范围内int i,j,k = 0,n = 0;Passwd = new char2 * textLen; /密文数组obvious = newText.GetBuffer(textLen); /明文数组newText.ReleaseBuffer(textLen);char *chKey = passKey.GetBuffer(passKey.GetLength(); /密钥数组passKey.ReleaseBuffer(passKey.GetLength();while(k < textLen)flag = 0;for(i = 0; i < 5; i+)for(j = 0; j < 5; j+)char mid = obviousk;if (mid = 'j')mid = 'i'if (ArrayKeyij = mid)Passwdn = chKeyi;Passwdn+1 = chKeyj;n = n + 2;flag = 1;break;if (flag = 0)Passwdn = obviousk;n+;k+;Passwdn = '0'result.Format("%s",Passwd);return result;/解密函数CString CMoreWordPasswd:MWRelessPass(CString oldText,CString passKey)int textLen = oldText.GetLength();CString result;int flag;int i,j,k = 0,n = 0;obvious = new chartextLen/2;Passwd = oldText.GetBuffer(textLen);oldText.ReleaseBuffer(textLen);char *chKey = passKey.GetBuffer(passKey.GetLength();passKey.ReleaseBuffer(passKey.GetLength();while(n < textLen)flag = 0;for(i = 0;i < 5;i+)if(Passwdn = chKeyi)flag = 1;break;if(flag = 1)for(j = 0;j < 5;j+)if(Passwdn+1 = chKeyj)break;if(flag = 0)obviousk = Passwdn;k+;n+;if(flag = 1)obviousk = ArrayKeyij;k+;n = n + 2;obviousk = '0'result.Format("%s",obvious);return result;4 Vigenere加密法4.1 算法概述Vigenere加密法不同于上面的两种加密法,它是一个著名的多码加密法。Vigenere加密法是基于关键词的加密系统,但不是像单码关键词加法那样使用关键词来定义替换模式的。Vigenere加密法,关键词写在明文的上面,并且不断重复书写,这样每个明文字母都与一个关键词的字母关联,例如,关键词为“make”,而明文为“tangyang”的情况下,关联词-明文的关联如下所示:表4.1 密文、明文对照表makemaket angyang利用如图4.1所示的Vigenere表,这些字母对就可以用来确定明文字符的加密结果。用密钥字母确定表的行,而明文字母确定表的列,表中行列交叉处的字母就是用来替代明文字母的密文字母。表4.2 vigenere表abcdefghijklmnopqrstuvwxyzaabcdefghijklmnopqrstuvwxyzbbcdefghijklmnopqrstuvwxyzaccdefghijklmnopqrstuvwxyzabddefghijklmnopqrstuvwxyzabceefghijklmnopqrstuvwxyzabcdffghijklmnopqrstuvwxyzabcdegghijklmnopqrstuvwxyzabcdefhhijklmnopqrstuvwxyzabcdefgiijklmnopqrstuvwxyzabcdefghjjklmnopqrstuvwxyzabcdefghikklmnopqrstuvwxyzabcdefghijllmnopqrstuvwxyzabcdefghijkmmnopqrstuvwxyzabcdefghijklnnopqrstuvwxyzabcdefghijklmoopqrstuvwxyzabcdefghijklmnppqrstuvwxyzabcdefghijklmnoqqrstuvwxyzabcdefghijklmnoprrstuvwxyzabcdefghijklmnopqsstuvwxyzabcdefghijklmnopqrttuvwxyzabcdefghijklmnopqrsuuvwxyzabcdefghijklmnopqrstvvwxyzabcdefghijklmnopqrstuwwxyzabcdefghijklmnopqrstuvxxyzabcdefghijklmnopqrstuvwyyzabcdefghijklmnopqrstuvwxzzabcdefghijklmnopqrstuvwxy4.2 算法分析在关键词为“make”,而明文为“tangyang”的情况下,关联词-明文的关联如下:表4.3 明文、密文对照表密钥makemake明文tangyang加密过程:用密钥字母确定表的行,而明文字母确定表的列,表中行列交叉处的字母就是用来替代明文字母的密文。对照Vigenere表查找密文分析结果如下:大写字母处理:首先将大写字母转换成小写字母,找到其密文后再将其转换成对应的小写字母。在Vigenere表中查找“m”列和“t”行,找到结果密文字母“f”,重复这个过程,可以生成以下的密文:表4.4 加密后的明文、密文对照表密钥makemake明文tangyang密文faxkkaxk则明文“tangyang”在关键词为“make”时,密文为“faxkkaxk”。解密过程:要破译Vigenere加密法,需要颠倒该查找过程。利用密钥和密文对,在Vigenere中确定相应的明文。要实现这些,找到由密钥确定的行,扫描该行,直到找到密文字母,该密文字母所在列的第一个字母就是明文字母。例如将上述密文“faxkkaxk”解密。在Vigenere表中查找“m”行中“f”的位置所对列的第一个字母,找到结果明文字母“t”,重复这个过程,则密文“faxhkaxh”解密后为“tangyang”。4.3核心代码/加密函数void CVienerePasswd:getPassKey(CString text,char *result,int len) /构建与明文字符长度相同的密钥数组int N = len / text.GetLength(); /text为密钥,result返回的结果,len明文长度int M = len % text.GetLength();char *strText = text.GetBuffer(text.GetLength();text.ReleaseBuffer(text.GetLength();strcpy(result,strText);for (int i = 1; i < N; i+)strcat(result,strText);if (M = 0) return;elsestrcat(result,strText);CString CVienerePasswd:VIGAddPass(CString newText,CString passKey)int i = 26,j = 26,k;int flag = 0;char chi,chj;CString result;int textLen = newText.GetLength();obvious = newText.GetBuffer(textLen);Passwd = new chartextLen;newText.ReleaseBuffer(textLen);char *chPassKey = new chartextLen;getPassKey(passKey,chPassKey,textLen);for (k = 0; k < textLen; k+)if (chPassKeyk > 64 && chPassKeyk < 91) /处理大写字母chi = chPassKeyk + 32; /大写字母转换为小写字母elsechi = chPassKeyk;if (obviousk > 64 && obviousk < 91)flag = 1;chj = obviousk + 32;elsechj = obviousk;i = getPassNum(chi);j = getPassNum(chj);if (j = 26 | i = 26)Passwdk = obviousk;elseif (flag = 1)Passwdk = ArrayKeyij - 32;flag = 0;elsePasswdk = ArrayKeyij;Passwdk = '0'result.Format("%s",Passwd);return result;int CVienerePasswd:getPassNum(char ch)for (int i = 0; i < 26; i+)if (ArrayNumi = ch)return i;return 26;/解密函数CString CVienerePasswd:VIGRelessPass(CString oldText,CString passKey)int flag = 0;int i = 26, j = 26, k, t;char chi,chj;CString result;int textLen = oldText.GetLength();Passwd = oldText.GetBuffer(textLen);obvious = new chartextLen;oldText.ReleaseBuffer(textLen);char *chPassKey = new chartextLen;getPassKey(passKey,chPassKey,textLen);for (k = 0; k < textLen; k+)if (chPassKeyk > 64 && chPassKeyk < 91)chi = chPassKeyk + 32;elsechi = chPassKeyk;if (Passwdk > 64 && Passwdk < 91)flag = 1;chj = Passwdk + 32;elsechj = Passwdk;i = getPassNum(chi);for (t = 0; t < 26; t+)if (ArrayKeyit = chj)break;if (t = 26)obviousk = Passwdk;elseif (flag = 1)obviousk = ArrayNumt - 32;flag = 0;elseobviousk = ArrayNumt;obviousk = '0'result.Format("%s",obvious);return result;5 Hill加密法5.1 算法概述Hill加密法是经典多图加密法的一种,要成功使用多图加密法,需要将数学方法应用到密码学中去,Hill提出了一种基于联立方程的加密算法。该加密算法将含有m个字母的明文块加密成含有m个字母的密文块。每个明文字母被赋予一个数值,通常是a=0,b=1,z=25,但Hill使用的是随机赋值,块中每个字母的数值一起用来生成一组新的数值,这些数值就用来表示密文字母。例如,如果m=3,那么3个明文字母的数值(假设为p1,p2和p3)将通过如下的方程组转换成密文数值c1,c2和c3:该加密法的密钥是kij值,取模操作的意思是将和除以26,得余数。确定密钥后将明文字母转换成数字形式,带入以上方程组,解方程组,得出密文的数值。再将这些数值转换回字母后,就得到其密文。由于传统的Hill加密算法只对26个字母进行加密,为了解决这一局限,对常用符号也能进行加密,从而采用ASCII码表作为加密参考,将模改为95(注:ASCII码值有128