一款经典加密解密教学演示软件的开发毕业设计(编辑修改稿)内容摘要:
算 法概述 Vigenere 加密法不同于上面的两种加密法,它是一个著名的多码加密法。 Vigenere 加密法是基于关键词的加密系统,但不是像单码关键词加法那样使用关键词来定义替换模式的。 Vigenere 加密法,关键词写在明文的上面,并且不断重复书写,这样每个明文字母都与一个关键词的字母关联,例如,关键词为“ make”,而明文为“ tangyang”的情况下,关联词 明文的关联如下所示 : 表 密文、明文对照表 m a k e m a k e t a n g y a n g 利用如图 所示的 Vigenere 表 ,这些字母对就可以用来确定明文字符的加密结果。 用密钥字母确定表的行,而明文字母确定表的列,表中行列交叉处的字母就是用来替代明文字母的密文字母。 表 vigenere 表 a b c d e f g h i j k l m n o p q r s t u v w x y z a a b c d e f g h i j k l m n o p q r s t u v w x y z b b c d e f g h i j k l m n o p q r s t u v w x y z a c c d e f g h i j k l m n o p q r s t u v w x y z a b d d e f g h i j k l m n o p q r s t u v w x y z a b c e e f g h i j k l m n o p q r s t u v w x y z a b c d f f g h i j k l m n o p q r s t u v w x y z a b c d e g g h i j k l m n o p q r s t u v w x y z a b c d e f h h i j k l m n o p q r s t u v w x y z a b c d e f g i i j k l m n o p q r s t u v w x y z a b c d e f g h j j k l m n o p q r s t u v w x y z a b c d e f g h i k k l m n o p q r s t u v w x y z a b c d e f g h i j l l m n o p q r s t u v w x y z a b c d e f g h i j k m m n o p q r s t u v w x y z a b c d e f g h i j k l n n o p q r s t u v w x y z a b c d e f g h i j k l m o o p q r s t u v w x y z a b c d e f g h i j k l m n p p q r s t u v w x y z a b c d e f g h i j k l m n o q q r s t u v w x y z a b c d e f g h i j k l m n o p r r s t u v w x y z a b c d e f g h i j k l m n o p q s s t u v w x y z a b c d e f g h i j k l m n o p q r t t u v w x y z a b c d e f g h i j k l m n o p q r s u u v w x y z a b c d e f g h i j k l m n o p q r s t v v w x y z a b c d e f g h i j k l m n o p q r s t u w w x y z a b c d e f g h i j k l m n o p q r s t u v x x y z a b c d e f g h i j k l m n o p q r s t u v w y y z a b c d e f g h i j k l m n o p q r s t u v w x z z a b c d e f g h i j k l m n o p q r s t u v w x y 陕西理工学院毕业设计 第 8 页 共 45 页 算法分析 在关键词为“ make”,而明文为“ tangyang”的情况下,关联词 明文的关联如下: 表 明文、密文对照表 密钥 m a k e m a k e 明文 t a n g y a n g 加密过程:用密钥字母确定表的行,而明文字母确定表的列,表中行列交叉处的字母就是用来替代明文字母的密文。 对照 Vigenere 表查找密文分析结果如下: 大写字母处理:首先将大写字母转换成小写字母,找到其密 文后再将其转换成对应的小写字母。 在 Vigenere 表中查找“ m”列和“ t”行,找到结果密文字母“ f”,重复这个过程,可以生成以下的密文: 表 加密后的明文、密文对照表 密钥 m a k e m a k e 明文 t a n g y a n g 密文 f a x k k a x k 则明文“ tangyang”在关键词为“ make”时,密文为“ faxkkaxk”。 解密过程:要破译 Vigenere 加密法,需要颠倒该查找过程。 利用密钥和密文对,在 Vigenere中确定相应的明文。 要实现这些 ,找到由密钥确定的行,扫描该行,直到找到密文字母,该密文字母所在列的第一个字母就是明文字母。 例如将上述密文“ faxkkaxk”解密。 在 Vigenere 表中查找“ m”行中“ f”的位置所对列的第一个字母,找到结果明文字母“ t”,重复这个过程,则密文“ faxhkaxh”解密后为“ tangyang”。 核心代码 //加密函数 void CVienerePasswd::getPassKey(CString text,char *result,int len) //构建与明文字符长度相同 的密钥数组 { int N = len / ()。 //text 为密钥, result 返回的结果, len 明文长度 int M = len % ()。 char *strText = (())。 (())。 strcpy(result,strText)。 for (int i = 1。 i N。 i++) { strcat(result,strText)。 } if (M == 0) return。 else { strcat(result,strText)。 } } CString CVienerePasswd::VIGAddPass(CString newText,CString passKey) { int i = 26,j = 26,k。 陕西理工学院毕业设计 第 9 页 共 45 页 int flag = 0。 char chi,chj。 CString result。 int textLen = ()。 obvious = (textLen)。 Passwd = new char[textLen]。 (textLen)。 char *chPassKey = new char[textLen]。 getPassKey(passKey,chPassKey,textLen)。 for (k = 0。 k textLen。 k++) { if (chPassKey[k] 64 amp。 amp。 chPassKey[k] 91) //处理大写字母 { chi = chPassKey[k] + 32。 //大写字母转换为小写字母 } else chi = chPassKey[k]。 if (obvious[k] 64 amp。 amp。 obvious[k] 91) { flag = 1。 chj = obvious[k] + 32。 } else chj = obvious[k]。 i = getPassNum(chi)。 j = getPassNum(chj)。 if (j == 26 || i == 26) { Passwd[k] = obvious[k]。 } else { if (flag == 1) { Passwd[k] = ArrayKey[i][j] 32。 flag = 0。 } else Passwd[k] = ArrayKey[i][j]。 } } Passwd[k] = 39。 \039。 (%s,Passwd)。 return result。 } int CVienerePasswd::getPassNum(char ch) 陕西理工学院毕业设计 第 10 页 共 45 页 { for (int i = 0。 i 26。 i++) { if (ArrayNum[i] == 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 = ()。 Passwd = (textLen)。 obvious = new char[textLen]。 (textLen)。 char *chPassKey = new char[textLen]。 getPassKey(passKey,chPassKey,textLen)。 for (k = 0。 k textLen。 k++) { if (chPassKey[k] 64 amp。 amp。 chPassKey[k] 91) { chi = chPassKey[k] + 32。 } else chi = chPassKey[k]。 if (Passwd[k] 64 amp。 amp。 Passwd[k] 91) { flag = 1。 chj = Passwd[k] + 32。 } else chj = Passwd[k]。 i = getPassNum(chi)。 for (t = 0。 t 26。 t++) { if (ArrayKey[i][t] == chj) break。 } if (t == 26) { obvious[k] = Passwd[k]。 } 陕西理工学院毕业设计 第 11 页 共 45 页 else { if (flag == 1) { obvious[k] = ArrayNum[t] 32。 flag = 0。 } else obvious[k] = ArrayNum[t]。 } } obvious[k] = 39。 \039。 (%s,obvious)。 return result。 } 陕西理工学院毕业设计 第 12 页 共 45 页 5 Hill 加密法 算法概述 Hill 加密法是经典多图加密法的一种,要成功使用多图加密法,需要将数学方法应用到密码学中去, Hill 提出了一种基于联立方程的加密算法。 该加密算法将含有 m 个字母的明文块加密成含有 m个字母的密文块。 每个明文字母被赋予一个数值 ,通常是 a=0,b=1,„ ,z=25,但 Hill 使用的是随机赋值,块中每个字母的数值一起用来生成一组新的数值,这些数值就用来表示密文字母。 例如,如果 m=3,那么 3 个明文字母的数值(假设为 p1,p2 和 p3)将通过如下的方程组转换成密文数值 c1,c2和 c3: 26m o d)(c 3132121111 pkpkpk 26m o d)(c 3232221212 pkpkpk 26m o d)(c 3332321313 pkpkpk 该加密法的密钥是 kij值,取模操作的意思是将和除以 26,得余数。 确定密钥后将明文字母转换成数字形式,带入以上方 程组,解方程组,得出密文的数值。 再将这些数值转换回字母后,就得到其密文。 由于传统的 Hill 加密算法只对 26 个字母进行加密,为了解决这一局限,对常用符号也能进行加密,从而采用 ASCII 码表作为加密参考,将模改为 95(注: ASCII 码值有 128 个,由于前 33 个为不可显示字符。一款经典加密解密教学演示软件的开发毕业设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。