本文主要內容:
- 密碼學是什麼;
- 代碼和加密法;
- 凱撒加密法;
- 加密輪盤;
- St. Cyr滑條;
- 用紙筆做加密;
- “雙重強度”加密。
我忍不住偷聽,可能因爲我在竊聽。——佚名
1 密碼學是什麼
看看以下兩段文字:
左邊的文字是祕密消息。這段消息已被加密,或者說被變成了祕密代碼。任何不知道如何解密(也就是把它變回普通英語消息)的人都無法閱讀。本書將會教你如何加密和解密消息。
右邊的消息只是隨機亂碼,沒有包含任何有意義的內容。加密你寫下來的消息是對其他人保密的一種方式,即使他們得到了加密之後的消息。這看起來和隨機亂碼完全一樣。
密碼學是使用祕密代碼的科學。密碼編譯者是使用和研究祕密代碼的人。本書會告訴你成爲一名密碼編譯者需要知道什麼。
當然,這些祕密消息並不總是保持祕密狀態。密碼破譯者是能破譯祕密代碼並讀取其他人的加密消息的人。密碼破譯者又稱爲代碼破譯者(code breaker)或代碼黑客(hacker)。本書也會告訴你成爲一名密碼破譯者需要知道什麼。遺憾的是,你在本書裏學到的破譯方式不會給你帶來麻煩(我的意思是,幸虧如此)。
間諜、士兵、黑客、海盜、貴族、商人、暴君、政治激進分子、網購者以及任何要與可信好友分享祕密的人都依賴密碼學,以確保他們的祕密還是祕密。
2 代碼與加密法
19世紀初發明的電報允許通過跨越大陸的電線進行即時通信,這比帶着一袋信件騎馬派送要快很多。然而,電報不能直接發送寫在紙上的字母,它只能發送電子脈衝。短脈衝叫“點”,長脈衝叫“線”。
圖1-1 Samuel Morse 1791年4月27日—1872年4月2日
圖1-2 Alfred Vail 1807年9月25日—1859年1月18日
爲了把這些點和線轉成英文字母,需要一個編碼(或代碼)系統把英語翻譯成電子脈衝代碼(編碼),另一邊把電子脈衝翻譯成英語(解碼)。用於電報(後來也用於無線電)的代碼叫摩斯代碼(Morse Code),由Samuel Morse(見圖1-1)和Alfred Vail(見圖1-2)發明。通過一個電報按鈕敲打出點和線,電報員可以把英語消息發給世界另一端的某個人,幾乎是實時的!(如果你想學習圖1-3所示的摩斯代碼,請到http://invpy.com/morse。)
圖1-3 國際摩斯代碼,通過點和線表示字符
代碼是可以理解的,而且是公開發布的。任何人都應該可以通過查找代碼符號的含義解密已被加密的消息。
3 製作紙質加密輪盤
在學習通過計算機編程進行加密和解密之前,我們先來了解一下如何使用簡單的紙質工具手工完成這項任務。把可理解的英語文字(明文)變成隱藏祕密代碼的亂碼文字(密文)是很容易的。加密法(cipher)是一組轉換明文和密文的規則。這些規則通常使用一個密鑰。我們會在本書裏學到多種不同的加密法。
我們來學一下凱撒加密法。這種加密法曾在兩千年前被凱撒大帝用過。好消息是,它學起來很簡單很容易。壞消息是,正因爲它簡單,密碼破譯者也很容易破譯它。但我們可以把它看做一個簡單的練習。Wikipedia上有更多關於凱撒加密法的信息:[http://en.wikipedia. org/wiki/Caesar_cipher](http://en.wikipedia. org/wiki/Caesar_cipher)。
要用凱撒加密法把明文轉成密文,需要製作一個加密輪盤(又名加密圓盤)。你可以複印本書給出的加密輪盤(見圖1-4和圖1-5),也可以打印http://invpy.com/cipherwheel上的那個加密輪盤。把這兩個圓圈剪下來,然後把它們疊在一起,參考圖1-6至圖1-8所示的步驟。
圖1-4 加密輪盤內圈
圖1-5 加密輪盤外圈不要從本書http://invpy.com/cipherwheel上打印上剪!複印本頁或從
圖1-6 剪下加密輪盤
圖1-7 剪下來的圓圈
圖1-8 完成後的加密輪盤
剪下兩個圓圈之後,把小的放在大的中間。在兩個圓圈中間插一根大頭針或曲頭釘,這樣你就可以在上面旋轉了。現在,你擁有使用凱撒加密法加密信息所需的工具了。
4 虛擬加密輪盤
如果你手頭沒有剪刀和複印機,你也可以使用在線虛擬加密輪盤(見圖1-9)。用瀏覽器打開http://invpy.com/cipherwheel,使用軟件版的加密輪盤。
圖1-9 在線加密輪盤
要旋轉輪盤,用鼠標在上面點擊一下,然後移動鼠標,直到你想要的密鑰在適當的位置上。再次點擊鼠標,就可以停止輪盤的旋轉。
5 如何使用加密輪盤加密
首先,在紙上用英語寫下你的消息。在這個例子裏,我們將會加密這條消息:“The secret password is Rosebud.”。接着,旋轉內圈,直到它的字母匹配外圈的字母。值得注意的是,外圈的字母A下面有一個點。再看看外圈裏的這個點對應的內圈裏的數字,這個數字就是密鑰。
這個密鑰就是加密或解密消息的祕密所在。任何讀過這本書的人都知道凱撒加密法,就像任何讀過關於鎖的書的人都知道門鎖的工作原理。但是,就像平常的鎖和鑰匙,除非他們有密鑰,否則他們不能解鎖(也就是解密)已被加密的消息。在圖1-9中,外圈的A在內圈的數字8上,這意味着我們將會使用8這個密鑰來加密我們的消息。凱撒加密法使用的密鑰範圍是0~25。我們的例子將會使用8這個密鑰。保管好這個密鑰,任何知道這條消息使用8這個密鑰加密的人都能讀懂密文。
對於我們的消息裏的每個字母,我們將會找到它在外圈的位置,然後把它替換成內圈對應的字母。我們的消息的第一個字母是T(“The secret…”裏的第一個“T”),於是我們在外圈找到字母T,然後找到內圈對應的字母。這個字母是B,因此,我們總會把我們的祕密消息裏的T替換成B(如果我們使用8以外的其他密鑰,那麼明文裏的T將被替換成別的字母)。
我們的消息裏的下一個字母是H,它會變成P。字母E會變成M。當我們加密完整條消息時,這條消息會從“The secret password is Rosebud.”變成“Bpm amkzmb xiaaewzl qa Zwamjcl.”(見圖1-10)。現在你可以把這條消息發給某人(或者給自己寫下來),沒人可以讀懂它,除非你把密鑰(數字8)告訴他們。
圖1-10 用加密輪盤加密的消息
外圈上的每個字母總是加密成內圈上相同的字母。爲了節約時間,在你查找“The secret…”裏的第一個T,並看到它會加密成B之後,你可以把這條消息裏的每個T都替換成B。這樣,一個字母你只需要查找一次。
6 如何使用加密輪盤解密
要解密一條密文,從內圈向外圈走。假設你從一個朋友那裏收到這條密文:“Iwt ctl ephhldgs xh Hldgsuxhw.”。你和其他人都不能解密它,除非你知道密鑰(或者除非你是個很聰明的黑客)。但你的朋友決定使用15這個密鑰加密自己發給你的每條消息。
把外圈上的字母A(下面有個點的那個)對準內圈上帶有數字15的字母(即字母P)。密文裏的第一個字母是I,因此,我們在內圈上找I,看看旁邊外圈上的字母,是T。密文裏的W會解密成字母H。一個接一個地,我們把密文裏的每個字母解密成明文:“The new password is Swordfish.”。
如果你使用不正確的密鑰,比如16,而不是正確的密鑰15,解密的消息是:“Sgd mdv ozrrvnqc hr Rvnqcehrg.”。這個明文根本看不懂。除非使用正確的密鑰,否則被解密的消息永遠不會是可理解的英語。
7 另一個加密法工具:St. Cyr滑條
還有一個紙質工具可以用來做加密和解密,這個紙質工具叫做St. Cyr滑條。它很像密鑰索引輪盤,但它是直的。
複印本頁的St. Cyr滑條圖片(或者從http://invpy.com/stcyrslide打印),剪下三條紙帶,如圖1-11所示。
圖1-11 複印這些紙帶製作St. Cyr滑條
連接兩條字母表紙帶,把黑框A粘在另一條紙帶上的白框Z旁邊。割開主滑框兩邊的裂縫,使連接起來的紙條可以穿過它。最後看起來應該是如圖1-12所示。
圖1-12 完成後的St. Cyr滑條
當黑框A在字母H(數字7)下面時,如果要加密,就在長紙帶上找出明文字母的位置,然後把它替換成在它上面的字母。如果要解密,就在上面那行字母裏找出密文字母,然後把它替換成下面的長紙帶上的字母。
大框兩邊的裂縫會隱藏其他的字母,這樣,對於任何密鑰,滑條上的每個字母你只會看到一個。
St. Cyr滑條的好處是更容易找到你要找的字母,因爲它們都在同一條直線上,不像加密輪盤那樣有時候會倒轉過來。
虛擬的可打印的St. Cyr滑條可以在http://invpy.com/stcyrslide找到。
8 A組練習
你可以在http://invpy.com/hackingpractice1A找到練習。
不要忽略練習!
本書沒有足夠的篇幅列出所有練習,但它們仍然重要。
僅僅閱讀關於黑客技術和編程的資料不會讓你成爲一名黑客。你需要實踐!
9 不用紙質工具做加密
在使用凱撒加密法做加密和解密時,加密輪盤和St. Cyr滑條都是很好的工具。但我們只用鉛筆和紙也可以實現凱撒加密法。
把字母表的字母從A到Z寫下來,在每個字母下面寫下數字0到25。在A下面寫0,B下面寫1,如此類推,直到在Z下面寫25(字母表裏有26個字母,但我們的數字最多隻到25,因爲我們從0而不是1開始的)。最終看起來像這樣:
有了上面這個從字母到數字的代碼,我們就可以用數字來表示字母了。這是一個非常強大的概念,因爲數學使用數字。現在我們可以在字母上做運算了。
現在,如果要加密,我們找到希望加密的字母下面的數字,然後把密鑰數字加上去。這個和就是加密的字母下面的數字。如,我們使用密鑰13加密“Hello. How are you?”。首先,我們找到H下面的數字,是7。接着,我們把密鑰加上這個數字,7 + 13 = 20。數字20在字母U下面,這意味着字母H加密成字母U。如果要加密字母E,我們把E下面的4加上13,得到17。17上面的字母是R,因此E加密成R。如此類推。
直到我們遇上字母O時這個方法纔會出問題。O下面的數字是14,當把14加上13時,我們得到27。但我們的數字列表最多隻到25。如果字母的數字和密鑰之和超過26,我們應該減去26,27 – 26得到1。數字1上面的字母是B。於是,當使用密鑰13時,字母O加密成字母B。一個接一個地,我們可以把“HELLO. HOW ARE YOU?”裏的字母加密成“URYYB. UBJ NER LBH?”。
因此,加密一個字母的步驟是:
1.從1到25選一個密鑰。保管好這個密鑰!
2.找出明文字母的數字。
3.把密鑰加到這個明文字母的數字。
4.如果這個數字大於26,則減去26。
5.找出你計算的數字的字母。這就是密文字母。
6.對明文消息裏的每個字母重複步驟2~5。
表1-1演示瞭如何使用密鑰13加密“HELLO. HOW ARE YOU?”裏的每個字母。每列演示了把左邊的明文字母變成右邊的密文字母的步驟。
表1-1 用紙和鉛筆加密“Hello. How are you?”的步驟
明文字母 | 明文數字 | + | 密鑰 | 結果 | 減去26? | 結果 | 密文字母 |
---|---|---|---|---|---|---|---|
H | 7 | + | 13 | = 20 | = 20 | 20 = U | |
E | 4 | + | 13 | = 17 | = 17 | 17 = R | |
L | 11 | + | 13 | = 24 | = 24 | 24 = Y | |
L | 11 | + | 13 | = 24 | = 24 | 24 = Y | |
O | 14 | + | 13 | = 27 | −26 | = 1 | 1 = B |
H | 7 | + | 13 | = 20 | = 20 | 20 = U | |
O | 14 | + | 13 | = 27 | −26 | = 1 | 1 = B |
W | 22 | + | 13 | = 35 | −26 | = 9 | 9 = J |
A | 0 | + | 13 | = 13 | = 13 | 13 = N | |
R | 17 | + | 13 | = 30 | −26 | = 4 | 4 = E |
E | 4 | + | 13 | = 17 | = 17 | 17 = R | |
Y | 24 | + | 13 | = 37 | −26 | = 11 | 11 = L |
O | 14 | + | 13 | = 27 | −26 | = 1 | 1 = B |
U | 20 | + | 13 | = 33 | −26 | = 7 | 7 = H |
如果要解密,你需要理解負數是什麼。如果你不知道如何加和減負數,可以參考教程http://invpy.com/neg。
如果要解密,減去這個密鑰,而不是加上它。對於密文字母B,這個數字是1。1減去13得到−12。就像加密的“減去26”規則,當解密並且結果小於0時,我們有一條“加上26”的規則。−12 + 26是14,因此,如表1-2所示,密文字母B解密回字母O。
表1-2 用紙和鉛筆解密密文的步驟
密文字母 | 密文數字 | − | 密鑰 | 結果 | 加上26? | 結果 | 明文字母 |
---|---|---|---|---|---|---|---|
U | 20 | − | 13 | = 7 | = 7 | 7 = H | |
R | 17 | − | 13 | = 4 | = 4 | 4 = E | |
Y | 24 | − | 13 | = 11 | = 11 | 11 = L | |
Y | 24 | − | 13 | = 11 | = 11 | 11 = L | |
B | 1 | − | 13 | = −12 | +26 | = 14 | 14 = O |
U | 20 | − | 13 | = 7 | = 7 | 7 = H | |
B | 1 | − | 13 | = −12 | +26 | = 14 | 14 = O |
J | 9 | − | 13 | = −4 | +26 | = 22 | 22 = W |
N | 13 | − | 13 | = 0 | = 0 | 0 = A | |
E | 4 | − | 13 | = −9 | +26 | = 17 | 17 = R |
R | 17 | − | 13 | = 4 | = 4 | 4 = E | |
L | 11 | − | 13 | = −2 | +26 | = 24 | 24 = Y |
B | 1 | − | 13 | = −12 | +26 | = 14 | 14 = O |
H | 7 | − | 13 | = −6 | +26 | = 20 | 20 = U |
如你所見,使用凱撒加密法加密是並不真的需要加密輪盤。如果你記住數字和字母,你甚至不必寫下字母表以及它們下面的數字。你只需心算就可以寫出祕密消息了。
10 B組練習
你可以在http://invpy.com/hackingpractice1B找到練習。
11 雙重強度加密
你可能在想,使用兩個不同密鑰加密同一條消息兩次會加倍加密的強度。但這對於凱撒加密法(以及大多數其他加密法)來說不是那麼一回事。讓我們雙重加密一條消息看個究竟。
如果我們用密鑰3加密“KITTEN”這個詞,得到的密文將是“NLWWHQ”。如果我們用密鑰4加密“NLWWHQ”這個詞,得到的密文將是“RPAALU”。這和用密鑰7加密“KITTEN”這個詞完全一樣。“雙重”加密和普通加密是一樣的,沒有任何強化。
其中的原因是,當我們用密鑰3加密時,我們把3加到明文字母的數字。接着,當我們用密鑰4加密時,我們把4加到明文字母的數字。但加上3再加上4和直接加上7完全一樣。用密鑰3和4加密兩次和用密鑰7加密一次是一樣的。
對於大多數加密法而言,多次加密不會增加密文的強度。事實上,如果你用兩個加起來等於26的密鑰來加密某些明文,你最終得到的密文和原來的明文是一樣的!
12 通過計算機編程進行加密
幾個世紀以來,凱撒加密法或者類似的加密法曾被用於加密信息。圖1-13是Albert Myer設計的加密圓盤,這個加密圓盤曾在1863年的美國南北戰爭中使用。
圖1-13 在美國國家密碼博物館展覽的美國南北戰爭同盟使用的加密圓盤
如果你有一段很長的消息希望加密(如加密一整本書),手工加密需要耗費數日或數週的時間。這正是編程派上用場的地方。計算機可以在一秒之內完成大量文字工作。但是,我們需要學習如何指示(也就是編程)計算機執行我們所做的步驟。
我們要會說一門計算機能懂的語言。幸運的是,學習編程語言不像學習日語或西班牙語等外語那麼難。你甚至不需要懂太多數學,除了加、減和乘。你只需下載一個叫Python的免費軟件,這個軟件我們將在下一章裏講解。
本文摘自剛剛上架的《Python密碼學編程》
《Python密碼學編程》適合不懂加密、破譯或密碼學的初學者。本書的加密法(除了最後一章的RSA加密法)都有數百年曆史了,現代計算機的計算能力可以破譯使用它們加密的信息,現代組織或個人已經不再使用這些加密法了。有鑑於此,你不會因爲本書裏的內容而惹麻煩。
本書適合從來沒有編過程序的初學者。本書使用Python編程語言講解基本編程概念。Python非常適合初學者學習編程:它是一種簡單可讀卻又強大的編程語言,爲專業軟件開發者所用。Python軟件可以從http://python.org免費下載,可以在Linux,Windows,OS X和樹莓派上運行。
“黑客”有兩種定義。一種“黑客”是指通過學習來理解一個系統,並跳出系統原有的規則限制,有創造性地修改它,使之以新的方式來工作的人。另一種“黑客”也用來指入侵計算機系統,觸犯個人隱私並造成傷害的罪犯。本書提到的“黑客”是第一種。黑客很酷,罪犯則只是通過破壞來顯擺智商的人。就我個人而言,我的本職是一名軟件開發者,和寫病毒或網絡詐騙相比,這份工作錢多活少。
還有一點要注意的,不要把本書裏的任何加密程序用於你的實際文件。它們可以帶來樂趣,但並不提供真正的安全。一般來說,你不應該信任你自己創造的加密法。正如傳奇密碼學家Bruce Schneier說的:“任何人,從最無能的外行到最好的密碼學家,都能創建出他自己無法破譯的算法。這並非難處。難處在於創建出別人無法破譯的算法,即使經過數年分析,證明那點的唯一途徑是通過各地最好的密碼學家對這個算法進行長達數年的分析。”