王麗麗
贏了守護使這一關,阿派終于進入了那一方神秘世界。一路上,他披荊斬棘、伏魔降妖平天下,并獲得了勝利的獎勵——魔法羊皮卷。展開卷宗,只有一行看不懂的咒語,內容是PQ ETQUU PQ ETQYP。阿派照著字母念了幾遍,都沒有任何動靜。忽然,他想到一種古老的加密方法——愷撒密碼。于是,他一遍又一遍地嘗試,終于發現若將所有字母都往前移2位,就可以形成一句有含義的話:NO CROSS NO CROWN(不經歷風雨,怎能見彩虹)。阿派大聲朗讀出破解的咒語,只見一道金光閃現。
這節課的設計靈感來源于愷撒密碼的故事。傳說,古羅馬皇帝愷撒在打仗時曾經使用“字母錯位”的方法來加密軍事情報。本課中,教師帶領學生理解這種古老而簡單的加密方法,并利用Python語言實現加密和解密。
在蘇托尼厄斯于公元二世紀寫的《愷撒傳》中,對愷撒密碼作了詳細描述,簡而言之,就是將真正的信件內容(明文)中的每一個字母用其后的第N個字母代替,轉換成一封密信(密文)。這樣,即便敵軍截住信件,也不知其意。據說,這種加密方法在當時的古羅馬頗為流行。這種將字母表中的字母移動一定位置而實現加密的方法,被稱為“愷撒移位密碼”,簡稱“愷撒密碼”。移動的位數N就是加密和解密的密鑰。

如圖1所示,前文中破解咒語的密鑰為2,也就是明文和密文表中的字母相錯兩位。A加密后所對應的字母就是后兩位的字母C,以此類推,且A~Z循環,因此,字母Z的加密字母為B,解碼的過程正好與之相反。
愷撒密碼的編碼方法相對簡單,密鑰也只有25種,只需逐個試驗,很容易破解,但這種加密、解密的思想影響深遠。現今的密碼術不斷發展,大致可分為兩種方法,即移位和替換,或者將兩者結合產生更復雜的方法,但萬變不離其宗,其核心還是算法和密鑰。
愷撒密碼的算法思想,前面已經解讀,此處不再贅述。但在Python中實現咒語的破解(解密),還需要了解字符在計算機中的表示方式。英文字母在計算機中通常采用ASCII碼表示,占一個字節。如圖2所示,密文中的字符P轉換為明文字符N的過程是這樣的:先利用ord()函數將ASCII字符P轉換為對應的ASCII數值80;再根據密鑰2進行倒推,計算出其明文的字符所對應的數值應為78;最后利用chr()函數將數值78轉換為對應的ASCII字符N。在這里,ord()和chr()這兩個函數的效果正好相反,結合兩者,可以實現字符的加密或解密。


利用Python語言實現破解咒語的具體過程如上表所示。想一想,如何允許用戶自行輸入咒語的文字信息,該如何修改程序?
isupper( )方法的作用是檢測字符串中所有的字母是否都為大寫,如果所有字符都是大寫,則返回True,否則返回False。例如,字符A的ASCII碼值是65,密鑰為2,因此在前移2位后,ASCII碼值變成了63,對應的字符是問號“?”,非大寫字母。此時,可在63的基礎上再向后移位26位,對應碼值為89(字符Y),即字符A對應的密文字符為Y。這樣,就形成了A~Z的循環。
本課中,阿派所破解的羊皮卷咒語是指定的密鑰2。加密的過程與解密相反,前移2位,變為后移2位,即-2。A~Z的循環處理,也是一樣,+26變為-26。此外,利用input()函數,允許用戶自行輸入咒語內容,具體的Python代碼如圖3所示。

upper( )方法的作用是將字符串中的字母全部轉換為大寫字母。這樣,如果用戶輸入的明文信息包含了大小寫字母,都會統一轉換為大寫字母,再進行加密。

使用不同的自定義密鑰進行加密,可以提高信息傳遞過程中的安全性。如圖4所示,新增變量key,提示用戶選擇1~25之間的某一個整數作為密鑰,實現自定義密鑰的加密咒語。
如果想讓這段程序更加實用,還可以詢問用戶選擇加密還是解密,多一次判斷,使用戶在同一個程序內可以自由選擇加密或解密模式。
由于愷撒密碼的秘鑰設置只有1至25,很容易被暴力破解,因此,人們在此基礎上進一步改善,主要方法是將密文的字母順序打亂。例如,圓盤密碼就是典型的利用單表置換的加密方法。在兩個同心圓盤上,外圈按照A~Z的字母序排列,內圈則按不同的順序填好字母或數字。轉動圓盤就可以找到字母的置換方法,很方便地進行信息的加密與解密。愷撒密碼與圓盤密碼本質都是一樣的,都屬于單表置換,即一個明文字母對應的密文字母是確定的,截獲者可以分析字母出現的頻率進行破譯。為了提高密碼的破譯難度,人們又發明了一種多表置換的密碼——維吉尼亞密碼。這種加密方法是根據密鑰決定用哪一行的密表來進行替換。因此,一個明文字母可以表示為多個密文字母,使得針對單表置換的用詞頻分析來破譯的方法失效,安全性更高一些。古代密碼的編碼方法還有很多。例如,滾桶密碼(又稱密碼棒),利用字條纏繞木棒的方式,實現字母的位移,收信人要使用相同直徑的木棒才能還原真實的信息。隨著社會發展,現代密碼引入了公鑰和私鑰的概念,也被稱為非對稱密碼學,與只用一個鑰匙的密鑰密碼學相對應。從愷撒密碼,到現代密碼學,你可以選擇一個有興趣的加密方法,了解更多加密原理,并利用Python來設計和編寫程序,試著模擬一次你的密信傳遞和破譯過程吧!