【文章內(nèi)容簡(jiǎn)介】
算 法概述 Vigenere 加密法不同于上面的兩種加密法,它是一個(gè)著名的多碼加密法。 Vigenere 加密法是基于關(guān)鍵詞的加密系統(tǒng),但不是像單碼關(guān)鍵詞加法那樣使用關(guān)鍵詞來(lái)定義替換模式的。 Vigenere 加密法,關(guān)鍵詞寫(xiě)在明文的上面,并且不斷重復(fù)書(shū)寫(xiě),這樣每個(gè)明文字母都與一個(gè)關(guān)鍵詞的字母關(guān)聯(lián),例如,關(guān)鍵詞為“ make”,而明文為“ tangyang”的情況下,關(guān)聯(lián)詞 明文的關(guān)聯(lián)如下所示 : 表 密文、明文對(duì)照表 m a k e m a k e t a n g y a n g 利用如圖 所示的 Vigenere 表 ,這些字母對(duì)就可以用來(lái)確定明文字符的加密結(jié)果。用密鑰字母確定表的行,而明文字母確定表的列,表中行列交叉處的字母就是用來(lái)替代明文字母的密文字母 。 表 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 陜西理工學(xué)院畢業(yè)設(shè)計(jì) 第 8 頁(yè) 共 45 頁(yè) 算法分析 在關(guān)鍵詞為“ make”,而明文為“ tangyang”的情況下,關(guān)聯(lián)詞 明文的關(guān)聯(lián)如下: 表 明文、密文對(duì)照表 密鑰 m a k e m a k e 明文 t a n g y a n g 加密過(guò)程:用密鑰字母確定表的行,而明文字母確定表的列,表中行列交叉處的字母就是用來(lái)替代明文字母的密文。對(duì)照 Vigenere 表查找密文分析結(jié)果如下: 大寫(xiě)字母處理:首先將大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)字母,找到其密 文后再將其轉(zhuǎn)換成對(duì)應(yīng)的小寫(xiě)字母。 在 Vigenere 表中查找“ m”列和“ t”行,找到結(jié)果密文字母“ f”,重復(fù)這個(gè)過(guò)程,可以生成以下的密文: 表 加密后的明文、密文對(duì)照表 密鑰 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”在關(guān)鍵詞為“ make”時(shí),密文為“ faxkkaxk”。 解密過(guò)程:要破譯 Vigenere 加密法,需要顛倒該查找過(guò)程。利用密鑰和密文對(duì),在 Vigenere中確定相應(yīng)的明文。要實(shí)現(xiàn)這些 ,找到由密鑰確定的行,掃描該行,直到找到密文字母,該密文字母所在列的第一個(gè)字母就是明文字母。 例如將上述密文“ faxkkaxk”解密。在 Vigenere 表中查找“ m”行中“ f”的位置所對(duì)列的第一個(gè)字母,找到結(jié)果明文字母“ t”,重復(fù)這個(gè)過(guò)程,則密文“ faxhkaxh”解密后為“ tangyang”。 核心代碼 //加密函數(shù) void CVienerePasswd::getPassKey(CString text,char *result,int len) //構(gòu)建與明文字符長(zhǎng)度相同 的密鑰數(shù)組 { int N = len / ()。 //text 為密鑰, result 返回的結(jié)果, len 明文長(zhǎng)度 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。 陜西理工學(xué)院畢業(yè)設(shè)計(jì) 第 9 頁(yè) 共 45 頁(yè) 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) //處理大寫(xiě)字母 { chi = chPassKey[k] + 32。 //大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母 } 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) 陜西理工學(xué)院畢業(yè)設(shè)計(jì) 第 10 頁(yè) 共 45 頁(yè) { for (int i = 0。 i 26。 i++) { if (ArrayNum[i] == ch) return i。 } return 26。 } //解密函數(shù) 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]。 } 陜西理工學(xué)院畢業(yè)設(shè)計(jì) 第 11 頁(yè) 共 45 頁(yè) else { if (flag == 1) { obvious[k] = ArrayNum[t] 32。 flag = 0。 } else obvious[k] = ArrayNum[t]。 } } obvious[k] = 39。\039。 (%s,obvious)。 return result。 } 陜西理工學(xué)院畢業(yè)設(shè)計(jì) 第 12 頁(yè) 共 45 頁(yè) 5 Hill 加密法 算法概述 Hill 加密法是經(jīng)典多圖加密法的一種,要成功使用多圖加密法,需要將數(shù)學(xué)方法應(yīng)用到密碼學(xué)中去, Hill 提出了一種基于聯(lián)立方程的加密算法。該加密算法將含有 m 個(gè)字母的明文塊加密成含有 m個(gè)字母的密文塊。每個(gè)明文字母被賦予一個(gè)數(shù)值 ,通常是 a=0,b=1,? ,z=25,但 Hill 使用的是隨機(jī)賦值,塊中每個(gè)字母的數(shù)值一起用來(lái)生成一組新的數(shù)值,這些數(shù)值就用來(lái)表示密文字母。例如,如果 m=3,那么 3 個(gè)明文字母的數(shù)值(假設(shè)為 p1,p2 和 p3)將通過(guò)如下的方程組轉(zhuǎn)換成密文數(shù)值 c1,c2和 c3: 26m o d)(c 3132121111 pkpkpk ??? 26m o d)(c 3232221212 pkpkpk ??? 26m o d)(c 3332321313 pkpkpk ??? 該加密法的密鑰是 kij值,取模操作的意思是將和除以 26,得余數(shù)。 確定密鑰后將明文字母轉(zhuǎn)換成數(shù)字形式,帶入以上方 程組,解方程組,得出密文的數(shù)值。再將這些數(shù)值轉(zhuǎn)換回字母后,就得到其密文。 由于傳統(tǒng)的 Hill 加密算法只對(duì) 26 個(gè)字母進(jìn)行加密,為了解決這一局限,對(duì)常用符號(hào)也能進(jìn)行加密,從而采用 ASCII 碼表作為加密參考,將模改為 95(注: ASCII 碼值有 128 個(gè),由于前 33 個(gè)為不可顯示字符