- Python密碼學編程(第2版)
- (美)阿爾·斯維加特
- 2350字
- 2020-05-20 09:12:23
1.3 凱撒密碼
即將學習的第一個密碼是凱撒密碼,它以早期使用者Julius Caesar的名字命名。它簡單易學,但也因此極易被密碼分析員破解。但是,它仍然可以用來進行練習。
凱撒密碼通過替換字母完成加密,每個字母由字母表中其后特定位數的字母代替。例如,Julius Caesar將字母表向后移動3個字母的位置,然后用得到的新字母表中的字母替換原消息中的每個字母。
例如,消息中的每一個A都變成D,每個B都變成E等。當Caesar需要將字母表末尾的字母(如Y)移位時,他會繞回到字母表的開頭,移動3個位置到B。在本節中,將使用凱撒密碼手動加密消息。
1.3.1 密碼輪
為了更方便地使用凱撒密碼將明文轉換為密文,將使用一個密碼輪,也稱為密碼盤。密碼輪包含兩個由字母組成的環,每個環有26個槽(為字母表的26個字母準備)。外圈表示明文中的字母,內圈表示在密文中相對應的字母。內圈同樣把字母從0到25進行標號,這些數字代表加密密鑰,這里的加密密鑰是指將A移動到內環上對應的字母所需經過的字母位數。因為輪盤是圓形的,用大于25的密鑰移位會使字母表繞一整個圈,所以移動26位與移動0位相同,移動27位與移動1位相同,以此類推。
讀者可以通過原書網站在線訪問虛擬的密碼輪,其形式如圖1-1所示。為了旋轉密碼輪,需要先單擊它,然后移動鼠標光標,直到想要的配置到位。再次單擊鼠標,密碼輪停止旋轉。

圖1-1 在線密碼輪
在本書的配套資源中也可以獲得可打印的紙版密碼輪。剪下兩個圓圈,把它們疊放,小的圓圈放在大的圓圈中間。在兩個圓圈的中心插入一個大頭釘或曲頭釘,這樣它們就可以旋轉了。
無論使用紙質密碼輪還是虛擬密碼輪,都可以完成手動加密。
1.3.2 使用密碼輪進行加密
開始加密前,請先用英文在一張紙上寫下待加密的消息。在這個例子中,待加密消息是“THE SECRET PASSWORD IS ROSEBUD”。接下來,旋轉密碼輪的內輪,直到它的槽與外輪中的槽相匹配。注意外輪上字母“A”旁邊的點,點在內輪上最接近的數字就是加密密鑰。
例如,在圖1-1中,外輪的“A”對應內輪的8。現在使用8作為加密密鑰來加密上面例子中的消息,如圖1-2所示。

圖1-2 用8作為密鑰的凱撒密碼加密消息
在外輪上找到消息中的每一個字母,并用內輪中對應的字母替換它。在這個例子中,消息的第一個字母是“T”(在“THE SECRET…”中的第一個“T”),因此在外輪上找到字母“T”,然后在內輪上找到對應的字母,也就是字母“B”。秘密信息總是用“B”替換“T”。(如果使用不同的加密密鑰,則明文中的每個T將被替換為其他的字母。)消息中的下一個字母是“H”,加密時變成“P”,而字母“E”變成“M”。外輪上的每個字母總是加密為內輪上固定的對應字母。為了節省時間,在查找“THE SECRET…”中的第一個“T”并且發現它加密變成“B”之后,就可以將消息中的每個“T”都替換為“B”,因此每個字母只需查找一次。
在對整個消息進行加密之后,原始消息“THE SECRET PASSWORD IS ROSEBUD”就變成了“BPM AMKZMB XIAAEWZL QA ZWAMJCL”。注意,非字母字符(如空格)是沒有改變的。
現在,可以把這個加密后的消息發送給他人(或者自己保存),除非告訴他們密鑰,否則沒有人能夠讀懂消息的含義。請確保加密密鑰是保密的,因為任何知道消息是用密鑰8加密的人都可以讀懂密文。
1.3.3 使用密碼輪進行解密
要對密文進行解密,需要查找從密碼輪的內輪到外輪的映射。假設接收的密文為“IWT CTL EPHHLDGS XH HLDGSUXHW”,除非知道密鑰(或者是一個聰明的黑客),否則將無法解密該消息。幸運的是,朋友已經提前告知,他們對消息加密時使用的密鑰是15。該密鑰的密碼輪如圖1-3所示。

圖1-3 密鑰設為15的密碼輪
現在可以將外輪上的字母“A”(下面帶點的那個字母)與內輪上的數字15(字母“P”)相對應。然后,在內輪上找到密文的第一個字母,即“I”,并查看外圈對應的字母,即“T”。密文中的第二個字母“W”解密為字母“H”。對密文中剩下的字母進行解密,還原成明文,可以得到完整的消息“THE NEW PASSWORD IS SWORDFISH”,如圖1-4所示。

圖1-4 用密鑰為15的凱撒密碼解密消息
如果使用不正確的密鑰(如16),則解密的消息將是“SGD MVV OZRRVNQC HR RVNQCEHG”,依然不可讀。除非使用正確的密鑰,否則解密出來的消息也是不可理解的。
1.3.4 通過計算進行加密和解密
使用密碼輪實現凱撒密碼的加密和解密是十分便捷的,但是也可以通過數學計算進行加密和解密。在此過程中,從“A”到“Z”寫出字母表中的字母,在每個字母下標注數字0~25。從“A”下面的0開始,“B”下面是1,以此類推,直到“Z”下面是25,如圖1-5所示。

圖1-5 為字母標號0~25
可以用這些數字來表示對應的字母。這是一個強有力的概念,有了它的存在,就可以在字母上進行數學運算。如果將字母“CAT”表示為數字2、0和19,分別加3獲得數字5、3和22,則根據圖1-5,這些新的數字表示字母“FDW”,這樣就實現了為“CAT”加密。稍后,會設計一個計算機程序實現這一計算過程。
要運用算術實現凱撒密碼的加密,請找到要加密的字母下方的數字,并將其加上密鑰的值,得到的和就是對應密文字母下的數字。可以使用1~25的任意數字作為密鑰,例如,使用密鑰13加密“HELLO. HOW ARE YOU?”。首先,找到“H”下的數字7,然后加上13:7+13=20。因為數字20在字母“U”之下,所以字母“H”加密得到“U”。
類似地,加密字母“E”(4)為4+13=17。因為17對應的是“R”,所以“E”加密得到“R”,以此類推。
直到字母“O”之前的過程都很順利。“O”之下的數字是14,但是14加上13是27,而序號只到25。如果字母對應的數字和密鑰相加的和是26或者更多,則需要從結果中減去26。在此例中,27?26=1。1對應的字母是“B”,因此“O”用密鑰13加密得到“B”。消息中的每一個字母加密完成后,密文是“URYYB. UBJ NER LBH?”
要對密文進行解密,需要減去密鑰而不再是進行加法運算。密文字母“B”對應的數字是1,1減去13得到?12。類似于“減去26”的加密規則,當解密結果小于0時,需要加上26。因為?12+26=14,所以密文字母“B”解密為“O”。
- JBoss Weld CDI for Java Platform
- Learning Single:page Web Application Development
- Hands-On Data Structures and Algorithms with JavaScript
- Learning AWS Lumberyard Game Development
- Quarkus實踐指南:構建新一代的Kubernetes原生Java微服務
- Spring+Spring MVC+MyBatis整合開發實戰
- 自然語言處理Python進階
- Visual C++開發入行真功夫
- Creating Mobile Apps with jQuery Mobile(Second Edition)
- C++從入門到精通(第5版)
- 匯編語言編程基礎:基于LoongArch
- Python Data Science Cookbook
- Python語言科研繪圖與學術圖表繪制從入門到精通
- Android Sensor Programming By Example
- Java設計模式深入研究