王麗麗
贏了守護使這一關(guān),阿派終于進入了那一方神秘世界。一路上,他披荊斬棘、伏魔降妖平天下,并獲得了勝利的獎勵——魔法羊皮卷。展開卷宗,只有一行看不懂的咒語,內(nèi)容是PQ ETQUU PQ ETQYP。阿派照著字母念了幾遍,都沒有任何動靜。忽然,他想到一種古老的加密方法——愷撒密碼。于是,他一遍又一遍地嘗試,終于發(fā)現(xiàn)若將所有字母都往前移2位,就可以形成一句有含義的話:NO CROSS NO CROWN(不經(jīng)歷風(fēng)雨,怎能見彩虹)。阿派大聲朗讀出破解的咒語,只見一道金光閃現(xiàn)。
這節(jié)課的設(shè)計靈感來源于愷撒密碼的故事。傳說,古羅馬皇帝愷撒在打仗時曾經(jīng)使用“字母錯位”的方法來加密軍事情報。本課中,教師帶領(lǐng)學(xué)生理解這種古老而簡單的加密方法,并利用Python語言實現(xiàn)加密和解密。
在蘇托尼厄斯于公元二世紀寫的《愷撒傳》中,對愷撒密碼作了詳細描述,簡而言之,就是將真正的信件內(nèi)容(明文)中的每一個字母用其后的第N個字母代替,轉(zhuǎn)換成一封密信(密文)。這樣,即便敵軍截住信件,也不知其意。據(jù)說,這種加密方法在當(dāng)時的古羅馬頗為流行。這種將字母表中的字母移動一定位置而實現(xiàn)加密的方法,被稱為“愷撒移位密碼”,簡稱“愷撒密碼”。移動的位數(shù)N就是加密和解密的密鑰。
如圖1所示,前文中破解咒語的密鑰為2,也就是明文和密文表中的字母相錯兩位。A加密后所對應(yīng)的字母就是后兩位的字母C,以此類推,且A~Z循環(huán),因此,字母Z的加密字母為B,解碼的過程正好與之相反。
愷撒密碼的編碼方法相對簡單,密鑰也只有25種,只需逐個試驗,很容易破解,但這種加密、解密的思想影響深遠?,F(xiàn)今的密碼術(shù)不斷發(fā)展,大致可分為兩種方法,即移位和替換,或者將兩者結(jié)合產(chǎn)生更復(fù)雜的方法,但萬變不離其宗,其核心還是算法和密鑰。
愷撒密碼的算法思想,前面已經(jīng)解讀,此處不再贅述。但在Python中實現(xiàn)咒語的破解(解密),還需要了解字符在計算機中的表示方式。英文字母在計算機中通常采用ASCII碼表示,占一個字節(jié)。如圖2所示,密文中的字符P轉(zhuǎn)換為明文字符N的過程是這樣的:先利用ord()函數(shù)將ASCII字符P轉(zhuǎn)換為對應(yīng)的ASCII數(shù)值80;再根據(jù)密鑰2進行倒推,計算出其明文的字符所對應(yīng)的數(shù)值應(yīng)為78;最后利用chr()函數(shù)將數(shù)值78轉(zhuǎn)換為對應(yīng)的ASCII字符N。在這里,ord()和chr()這兩個函數(shù)的效果正好相反,結(jié)合兩者,可以實現(xiàn)字符的加密或解密。
利用Python語言實現(xiàn)破解咒語的具體過程如上表所示。想一想,如何允許用戶自行輸入咒語的文字信息,該如何修改程序?
isupper( )方法的作用是檢測字符串中所有的字母是否都為大寫,如果所有字符都是大寫,則返回True,否則返回False。例如,字符A的ASCII碼值是65,密鑰為2,因此在前移2位后,ASCII碼值變成了63,對應(yīng)的字符是問號“?”,非大寫字母。此時,可在63的基礎(chǔ)上再向后移位26位,對應(yīng)碼值為89(字符Y),即字符A對應(yīng)的密文字符為Y。這樣,就形成了A~Z的循環(huán)。
本課中,阿派所破解的羊皮卷咒語是指定的密鑰2。加密的過程與解密相反,前移2位,變?yōu)楹笠?位,即-2。A~Z的循環(huán)處理,也是一樣,+26變?yōu)?26。此外,利用input()函數(shù),允許用戶自行輸入咒語內(nèi)容,具體的Python代碼如圖3所示。
upper( )方法的作用是將字符串中的字母全部轉(zhuǎn)換為大寫字母。這樣,如果用戶輸入的明文信息包含了大小寫字母,都會統(tǒng)一轉(zhuǎn)換為大寫字母,再進行加密。
使用不同的自定義密鑰進行加密,可以提高信息傳遞過程中的安全性。如圖4所示,新增變量key,提示用戶選擇1~25之間的某一個整數(shù)作為密鑰,實現(xiàn)自定義密鑰的加密咒語。
如果想讓這段程序更加實用,還可以詢問用戶選擇加密還是解密,多一次判斷,使用戶在同一個程序內(nèi)可以自由選擇加密或解密模式。
由于愷撒密碼的秘鑰設(shè)置只有1至25,很容易被暴力破解,因此,人們在此基礎(chǔ)上進一步改善,主要方法是將密文的字母順序打亂。例如,圓盤密碼就是典型的利用單表置換的加密方法。在兩個同心圓盤上,外圈按照A~Z的字母序排列,內(nèi)圈則按不同的順序填好字母或數(shù)字。轉(zhuǎn)動圓盤就可以找到字母的置換方法,很方便地進行信息的加密與解密。愷撒密碼與圓盤密碼本質(zhì)都是一樣的,都屬于單表置換,即一個明文字母對應(yīng)的密文字母是確定的,截獲者可以分析字母出現(xiàn)的頻率進行破譯。為了提高密碼的破譯難度,人們又發(fā)明了一種多表置換的密碼——維吉尼亞密碼。這種加密方法是根據(jù)密鑰決定用哪一行的密表來進行替換。因此,一個明文字母可以表示為多個密文字母,使得針對單表置換的用詞頻分析來破譯的方法失效,安全性更高一些。古代密碼的編碼方法還有很多。例如,滾桶密碼(又稱密碼棒),利用字條纏繞木棒的方式,實現(xiàn)字母的位移,收信人要使用相同直徑的木棒才能還原真實的信息。隨著社會發(fā)展,現(xiàn)代密碼引入了公鑰和私鑰的概念,也被稱為非對稱密碼學(xué),與只用一個鑰匙的密鑰密碼學(xué)相對應(yīng)。從愷撒密碼,到現(xiàn)代密碼學(xué),你可以選擇一個有興趣的加密方法,了解更多加密原理,并利用Python來設(shè)計和編寫程序,試著模擬一次你的密信傳遞和破譯過程吧!