(一)Python密碼學之旅---01古典密碼之初識
一提起「密碼」這個詞,大家總是覺得它蒙著一層神秘的面紗,給人的感覺總是神乎其神。其實不盡然,密碼學源於我們的生活,反過來服務於我們,現在每個人都在使用著密碼學的服務。從知乎、QQ等的驗證登錄,到支付寶的安全支付,再到最近火熱的比特幣和區塊鏈技術,都離不開密碼的支持。筆者想通過一系列的Python密碼學教程,使大家正確認識密碼學,理解密碼基本概念,並能正確將密碼學應用於實踐之中。
本節將介紹密碼學的基本概念和發展歷程,以古典密碼為例,了解密碼學的基本加密方法。
一、密碼學簡介
密碼學是一門非常古老的學科,是把人們能夠讀懂的消息變換成不易讀懂的信息用來隱藏信息內容,使得竊聽者無法理解消息的內容,同時又能夠讓合法用戶把變換的結果還原成能夠讀懂的消息。
密碼學的發展經歷了3個階段:(1)古典密碼。這個時期的密碼應該被稱之為藝術,而不是科學,是古代人民智慧的結晶,典型的密碼有陰符、藏頭詩、石蠟密信、反切密碼(明代戚繼光)、凱撒密碼和天書等。(2)近代密碼。1949年,偉大科學家香農發表了著名的《保密系統的通信理論》和《通信的數學理論》兩篇文章,使得密碼學從此由藝術走上了科學的道路,成為一門學科。(3)現代密碼學。1976年,美國國家標準局公布了數據加密標準(DES),這一對稱密碼標準在世界上廣泛流傳和應用;同年,密碼學家、圖靈獎獲得者Diffie和Hellman(2016年圖靈獎)發表了《密碼學的新方向》,開創了公鑰密碼學的新紀元。
二、古典密碼
作為密碼學的最開始發展階段,雖然並未形成體系,但有了近現代密碼的雛形,體現了密碼學的加密思想。
兩種基本的加密思想為:(1)代替(substitution)/替換,即明文字元被其他字元所替換,典型的密碼為凱撒密碼。(2)置亂(permutation)/置換,即打亂明文字元的順序,典型的密碼有天書、柵欄密碼、矩陣密碼等。
下面介紹最為經典的兩種古典密碼,即凱撒密碼和柵欄密碼,並使用Python進行實現。
2.1 凱撒密碼
該密碼以被古羅馬皇帝凱撒使用而聞名,用於和將軍們進行聯繫。它通常被作為其他更複雜的加密方法中的一個步驟,例如維吉尼亞密碼。但是和所有的利用字母表進行替換的加密技術一樣,愷撒密碼非常容易被破解,而且在實際應用中也無法保證通信安全。
其基本思想是:通過把字母移動一定的位數來實現加密和解密。例如,密匙是把明文字母的位數向後移動三位,那麼明文字母B就變成了密文的E,依次類推,X將變成A,Y變成B,Z變成C。
實現代碼為:
#字元表nmstr=abcdefghijklmnopqrstuvwxyzn#字元表長度nlengthM=len(mstr)nn#strs為輸入的明文,shitf為移動的位數ndef caesar(strs,shift):n newstrs =n for x in strs:n #獲取x字元在mstr中的位置n numX=mstr.index(x)n n #新的字元位置加上shiftn numX=(numX+shift)%lengthMn n newstrs=newstrs+mstr[numX]n n return newstrsnnif __name__ == __main__:n strs = raw_input("Enter character sequence:")n shift = input("Shift Numbers:")n C=caesar(strs,shift)n print("CiperText:",C)n print("PlainText:",caesar(C,int(shift)*(-1)))n
運行結果為:
>>Enter character sequence:abcden>>Shift Numbers:3n(CiperText:, defgh)n(PlainText:, abcde)n
2.2 柵欄密碼
該密碼的思想是「按列寫入,按行讀出」,就是把要加密的明文分成N個一組,然後把每組的第1個字連起來,形成一段無規律的話。
例如:用深度為2的柵欄技術加密明文「meet me after the party」
n可寫為
那麼按行讀出,密文為「mematrhtpryetefeteat」
def encrypt(pT,key):n #一維key列的字元串數組n array=[""]*keyn n #將明文pT,按列寫入array中n for x in range(0,len(pT)):n row=x%keyn array[row]+=pT[x]n print arrayn n #cp即為密文,將array按行讀出 n cp="" n for x in array:n cp+=xn n return cpnnnif __name__ == __main__:n #明文 n plainTxt="meetmeaftertheparty" n #柵欄設置為2欄n key=2n #對明文加密,並輸入密文n cipherTxt=encrypt(plainTxt,key)n print cipherTxtn
三、總結
本節介紹了密碼學的基本概念和發展歷程,接著講解了古典密碼中的凱撒密碼和柵欄密碼,並使用Python實現。
請大家在閱讀後,使用Python自行編寫出柵欄密碼的解密演算法。
參考文獻:
- 彭長根.現代密碼學趣味之旅.金城出版社.2015
- AI Sweigart. Python密碼學編程.人民郵電出版社.2016
- 鄭東, 趙慶蘭, 張應輝. 密碼學綜述[J]. 西安郵電大學學報, 2013, 18(6): 1-10.
推薦閱讀:
※數學中的戰爭,戰爭中的數學——漫談密碼(1)
※關於重合指數的問題?
※RSA系列——高精度除法
※現在密碼學研究還有實際意義嗎?