29.Python密碼學入門之八:手把手破解維吉尼亞加密後的英文詩

2020-12-06 和孩子一起學Python

百家號不支持代碼格式,文章裡的代碼排版都是亂的。

如果需要拷貝代碼,可以去同名微信公眾號。

上篇說到,維吉尼亞密碼不能通過暴力進行破解。

因為秘鑰的長度是不固定的,如果希望不被破解,只需要增加秘鑰的長度就可以了,當秘鑰長度是15位時,一臺每秒可以嘗試1000萬次的電腦也需要1000多萬年才能夠暴力破解維吉尼亞密碼。

同時,也不能像破解簡單替換加密那樣,通過計算字母出現的頻率,和字母的單詞模式來破解,因為經過維吉尼亞加密之後,字母頻率和單詞模式都變化了。

上一篇的最後,給了一首經過維吉尼亞加密之後的英文詩,這一篇,我們就來演示如何來破解這首詩。

SCRQUYMMSUOGHYMEOHEHHOGOXZKI

FYQCMINSSTGUWZCMGLAVR

BZKHEHJGZEMXINXUHVDXYOCQIMLWG

FYQCMIMSSNPYPDNMHEVZWUYR

CSQXOICNTAZWGFGOXBPQVRHZBWEFWGAPS

MSASLPHCISLFZJICSQILMOIRYO

HCIUYGRILXMAVCPBYMMMZJACYUDRNSSRMHO

HCIUYGRILTGWPIHWIKCYHCIQTBY

LIHAVRSJSVVMXINXUXCPRNLWIIRTGO

FYQCMICEWNAUDVZHNZHCIMPO

CSQXOICSPOMWWLBNSGPDZSJWSZBCDH

WIZZFZXBPMVVYLZGSQPROSVPTMIY

SCRQUYMOMGPGXEHLAVRNFFILCDVZEX

LBYTLPHZRXEVVXBPXPWNOCZWHEGZI

NSSVRMHSMQSQFDIHOWNFFZKDRATBOLYHWIH

NSSVRMHSMMMMZJACYUDRNSSRMHO

VJAGLBTXCXSNQODHVQUYZJSEFD

WIZZFZLYNOIWYPHCIMVM

CSQXOICYLFNQODHJRYXOILUGS

WIZZFZLYNOILYLFKIIAZZGLJ

VJAGLBTHYLHCWQTZGMNEOFI

NTZGLYVBJAMEVVXNZCHEHJDZSJWSCEPPRDIX

EVZEHDKZVGJTMMYYRDWVWCRMHRWIXBPKDRX

EVZEHDKZVCDPGSQTBBMHEVZACYR

破解維吉尼亞密碼的歷史故事

1854年,也就是在1553年貝拉索出版《吉奧萬·巴蒂斯塔·貝拉索先生的算術》之後整整300年,英國發明家,科學管理的先驅者查爾斯·巴貝奇宣布成功破解了維吉尼亞加密。但是他並沒有公布他的破解方法。

直到9年後的1863年,一位叫弗裡德裡希·卡西斯基的密碼學家獨立破解了維吉尼亞密碼,並發表了完整的破解方法,所以,後人習慣稱破解維吉尼亞密碼的方法為卡西斯基實驗。

但巴貝奇也不是在撒謊,後人在整理他生前筆記時,發現他的確早於卡西斯基就破解了維吉尼亞加密。關於巴貝奇,雖然在國內名氣並不大,但是在國外,甚至大多數人都認為他才是真正的計算機之父。巴貝奇的一生很有傳奇色彩,但就不在這裡展開了,有興趣的話可以百度百科。

下圖就是巴貝奇和他設計的計算機的前身「差分機」。

那麼巴貝奇或者說卡西斯基的破解方法是怎麼樣的呢?

其實現在看來,也就2招。

第一招:通過相同子串間隔確定秘鑰長度

還是上一篇的詩句為例,假設加密前明文如下

If you shed tears when you miss the sun you also miss the stars

我們選了一個新的秘鑰,加密之後得到的密文是

Jh bsv ukie vhesu zlfp bsv olwt vki twq cpw dptq pmtu wlf uwesu

看上去密文沒有什麼規律可循,但是仔細看,我們發現有2個子串是相同的。

Jh bsvukie vhesu zlfp bsv olwt vki twq cpw dptq pmtu wlf uwesu

這說明什麼呢?

一種可能,前後2個bsv對應的3個明文字母不同,每個字母對應的秘鑰也不同,機緣巧合之下,正好加密出了相同的密文。

比如說

abc 通過秘鑰 BRT 加密之後得到的密文是 bsv

xyz 通過秘鑰 EUW 加密之後得到的密文也是 bsv

另一種可能是,前後2個bsv對應的3個明文字母相同,每個字母對應的秘鑰也正好相同。

比如說,第一個是 abc 通過BRT加密所得,第二個也是 abc 通過BRT加密所得。

如果這樣的字符串只是偶爾出現,可能說明不了什麼問題。

但如果密文裡,出現了較多這樣重複的字符串,特別是字符串長度還比較長,那麼直觀猜測,這不太可能是不同的明文恰巧經過不同的秘鑰加密出相同的密文。

密碼學家們對此已經給出了嚴謹的證明,但我們不需要關心這個。只需要知道

如果密文裡出現長度大於3的相同子串,那麼它們很可能是由相同的明文經過相同的秘鑰加密得到的密文。

有了這個假設,就可以推測維吉尼亞秘鑰的長度了。

假設第一個 bsv對應的秘鑰是???

那麼第二個 bsv對應的秘鑰還是 ???

最直接的猜測是 ??? **** ***** **** 正好是完整的秘鑰,也即秘鑰長度為16。

Jh bsvukie vhesu zlfp bsv olwt vki twq cpw dptq pmtu wlf uwesu

??? **** ***** **** ??? **** ***** ****

不過仔細想一想,其實秘鑰的長度只要是16的因數就可以。

比如說秘鑰的長度是8,也能夠保證第2個bsv位置對應的秘鑰是相同的。

Jh bsvukie vhesu zlfp bsv olwt vki twq cpw dptq pmtu wlf uwesu

??? **** *???* **** ???

同理,秘鑰長度也可能是4,2,1。

所以,破解維吉尼亞密碼的第一招,就是在密文裡找相同的子字符串,並計算它們的間隔。

下面的程序,就是在密文裡找所有長度為6的子字符串,檢查密文裡有沒有相同的子字符串,並計算它們的間隔。

with open('data/poem.txt') as fr:

lines = fr.readlines()

poem=''

for line in lines:

poem += line

poemStr = ''.join(poem.split())

poemLen = len(poemStr)

subLen =6

result = {}

for i in range(poemLen-subLen):

subStr = poemStr[i:i+subLen]

if subStr in result:

continue

start = i+subLen

position = i

while start < poemLen - subLen:

compStr = poemStr[start:start+subLen]

if subStr == compStr:

if subStr in result:

result[subStr] = result[subStr]+','+str(start-position)

else:

result[subStr] = str(start-position)

position = start

start = start + subLen

else:

start += 1

print(result)

如上圖,執行程序,找到很多這樣的字符串。比如

'SCRQUY': '335' 說明'SCRQUY'出現了2次,2次中間隔了335個字符。

'FYQCMI': '50,175',說明'FYQCMI'出現了3次,分別隔了50和175個字符。

觀察所有這些重複出現過的字符串的間隔,很容易發現,公因數是5。

所以,這次維吉尼亞秘鑰的長度是5。

第2招:通過字母頻率猜凱撒秘鑰

通過第1招,我們已經知道秘鑰的長度是5,但依然還不知道是哪5個字母。

當然,一種方式是暴力破解,因為知道長度後,只需要嘗試 26*26*26*26*26=11,881,376次,對計算機來說,也就一兩秒的事。

不過麻煩的是,計算機嘗試了所有的可能,還需要人去查看哪種可能是正常的英文單詞,對人來說,1000多萬實在過於龐大。

所以,我們希望有進一步的方法,可以縮小嘗試的範圍。而這個方法的思路其實在前面已經介紹過。

既然已經知道了秘鑰的長度是5。

那麼我們可以把密文分成5組,每組對應的秘鑰是相同的。

然後對每組都分別用26個英文字母進行凱撒解密,究竟哪個字母才是正確的秘鑰呢?可以用字母頻率做參考。

以如下第一組為例

SYOEHZQSWLZJXHOLQSPEYXTFPZWMPLCMOYXPMYSOYTHYTHJXXLTQEDZPXPLPWDZPLPPSYPLFDLPEPOESHQOZTHSHMYSOLXDYFZNPVXLDXGZNLAJLLTETVEZJWPEDJYWRPEDDTEY

用26個字母分別進行嘗試解密,並對解密出來的內容按字母出現的次數排序。

比如如上內容按字母A進行解密,解出來的內容中,按字母出現次數排序是

AWJPKIDEOZSHUBXQYGNRLC

而我們知道從統計上說,26個英文字母出現的頻率排序是

ETAOINRSHDCLMPUFGWYBVKXJQZ

怎麼衡量,用字母A的解密效果呢?

密碼學家給出的辦法是:計算前6個字母,後6個字母中重複字母的個數。

我們發現,用字母A進行解密之後,最前6個字母和最後6個字母中,只有2個字母是和統計學上的字母頻率順序吻合的。

AWJPKIDEOZSHUBXQ YGNRLC

ETAOIN RSHDCLMPUFGWYB VKXJQZ

依次用後續的字母進行解密.

message = 'SYOEHZQSWLZJXHOLQSPEYXTFPZWMPLCMOYXPMYSOYTHYTHJXXLTQEDZPXPLPWDZPLPPSYPLFDLPEPOESHQOZTHSHMYSOLXDYFZNPVXLDXGZNLAJLLTETVEZJWPEDJYWRPEDDTEY'

decrypt = ''

key = 'L'

numKey = ord(key) - 65

def calPro(message):

prob = 'ETAOINRSHDCLMPUFGWYBVKXJQZ'

dic = {}

for i in range(len(message)):

if message[i] in dic:

dic[message[i]] += 1

else:

dic[message[i]] = 1

dic = sorted(dic.items(),key=lambda item:item[1],reverse=True)

compStr = ''

for i in dic:

compStr += i[0]

cn = 0

for i in range(6):

if prob.index(compStr[i]) < 6:

cn += 1

if prob.index(compStr[len(compStr)-i-1])>19:

cn += 1

print(compStr,cn)

for j in range(len(message)):

decrypt += chr(65+(ord(message[j])-65-numKey)%26)

calPro(decrypt)

所有26個字母嘗試一遍,我們發現用字母L進行解密,吻合的字母是最多的。

因此,我們推測第一個秘鑰是字母L。

照葫蘆畫瓢,按同樣的方法破解後面的秘鑰。

最後得到最有可能的秘鑰是 LOVEU

破解成功

用LOVEU進行解密的結果如下。

正是鮑勃·迪倫的代表作《blowing in the wind》。

作為搖滾樂和民謠的一代宗師,2016年,鮑勃·迪倫獲得諾貝爾文學獎,稱為第一位獲得該獎項的非文學家。

破解維吉尼亞密碼簡單嗎?

雖然我們成功地破解了這首詩,但並不代表維吉尼亞密碼很容易破解。特別是第一步,破解秘鑰的長度。

如果明文裡有大量的重複,就像我們挑的這首詩,它其實是一首歌,所以自然會有大量的重複,所以出現重複字符串的概率就比較高,容易破解。

但是當明文很短,並且很少有大段內容重複時,要破解維吉尼亞加密還是比較困難的。

所以,李雷的父母並沒有再次成功破解密碼。

這次的問題出在Jim身上,在李雷的父母無計可施後,他們直接找到了Jim,威脅Jim,成功拿到了密碼。

那麼我們要思考的問題是,如果密碼都被人獲取了,加密還安全嗎?

相關焦點

  • 25.Python密碼學入門之四:仿射加密
    對信件的內容進行加密,就可以躲過父母的監控。但是沒想到的是,他的加密方法很快就被爸爸破解了。究其根源在於,「凱撒加密」的有效秘鑰實在是太少了。表面看上去,「凱撒加密」的秘鑰可以有無限多個,但其實真正有效的只有26個。比如秘鑰 key = 1 和 秘鑰 key = 27 效果是一樣的,都是把字母向後平移1位。
  • 中國密碼學第一人,孕期開始破解美國安全密碼,用兩年成功破解
    當她聚精會神地思考問題時,常常手託下巴,一雙炯炯有神而又銳利的目光注視著天花板一動不動,仿佛時間都停止在那一刻。而看似發呆的她,其實已深陷知識的迷宮,不斷地尋找突破方向。學過編程的人應該都使用過MD5加密,是美國研製的一套程序加密方式,當時美國聲稱沒有人能夠破解這套加密算法。當時MD5加密方式被世界很多國家所使用,而且大多數人對其評價頗高。
  • 吳軍:《數學之美》中的密碼學原理,古代密碼學和現代密碼學
    在《數學之美》的第17章,吳軍由於很喜歡電視劇《暗算》的構思和演員的表演,給我們科普了密碼學原理。密碼學聽起來很神秘,也比較有趣,那麼密碼學原理究竟是什麼?古代密碼學和現代密碼學又有什麼區別呢?雖然古代密碼學發展後期出現了一些幹擾加亂的迷惑方式,比如豬筆加密法、柵欄密碼和後面出現的著名的莫斯密碼,但由於古代密碼基於的是邏輯推理,就相當於要打開這把密碼鎖,你只要想辦法去配一把同樣的鑰匙就可以了,所以古代密碼加密方式還是有比較大的缺陷。密碼學故事。1914年,德國襲擊俄國海岸,不料因海霧而擱淺,繼而被俄國炮擊,密碼本因此被截取。
  • 在量子計算機到來之前,請準備好抗量子破解的密碼學
    雖然許多專家並不認為量子計算機能夠在未來十年內具備破解現代標準密碼術所需要的複雜計算能力,但是,美國國家標準與技術局(NIST)希望走在前面,讓新的密碼標準在2022年之前準備好。這一機構正在審查其「後量子密碼學標準化程序」的第二階段,以縮小抗量子破解並能夠替代現代密碼學的最佳候選加密算法的範圍。
  • 美國是如何發展後量子密碼學的?
    當實用的量子計算最終到來時,它將有能力破解保障政府、企業和幾乎所有使用網際網路的人的在線隱私和安全的標準數字代碼。這就是為什麼一個美國政府機構向研究人員提出挑戰,要求他們開發新一代的抗量子密碼算法。許多專家並不指望能夠執行破解現代密碼學標準所需的複雜計算的量子計算機能在未來10年內成為現實。
  • 從數學到物理學:加密算法簡介
    是不是只有那些數學頭腦很好的人,才能理解那些在信息安全中常常用到的技術(密碼學)?如果你要成為密碼學家,那可能是的,畢竟密碼學家的工作就是構造極難破解的加密算法。但是加密方法在當今世界的用途已經非常普遍了,從保護用戶的信用卡信息、保護遠程用戶的網絡連接,到保護智力產權、防止盜版,密碼學無處不在。
  • 默克爾樹創始人談加密貨幣和量子時代密碼學
    加密貨幣有望成為貨幣的未來,但是這種野心受到量子密碼破解技術進步的威脅。與公共密鑰密碼學先驅拉爾夫·默克爾(Ralph Merkle)博士,以了解下一代量子抗性密碼標準如何幫助區塊鏈加密保持安全。問:拉爾夫,讓我們從您的背景開始:作為公鑰密碼學和密碼哈希技術的發明者之一,您的工作對於現代網際網路的安全至關重要。考慮到此成就的全球範圍和實用性,創建對數據身份驗證和加密如此重要的內容的感覺如何?答:很顯然,擁有一件已經被廣泛使用並且會隨著時間的流逝而被更廣泛使用的作品,感覺很棒。隨著我們繼續進入數字時代,對於密碼學的身份驗證和隱私而言,事情只會越來越好。
  • 什麼是後量子密碼學?
    什麼是後量子密碼學?量子密碼學對經典公鑰密碼學意味著什麼?量子密碼學可以解決什麼問題。
  • 什麼是後量子密碼學?保護數據免受量子計算機威脅的競賽正在展開
    這就是為什麼研究人員和安全公司競相開發新的加密方法,使之能夠抵禦未來黑客發起的量子攻擊。數字加密是如何工作的?加密有兩種主要類型。對稱加密和非對稱加密。加密的目標是阻止黑客利用計算能力暴力破解密鑰。要達到這一點,通常加密方法都會使用一種稱為陷門函數的方法,它正向創建密鑰容易,逆向破解則很難。黑客是通過嘗試所有可能的密鑰變體來試圖成功破解密碼。
  • 玩轉Python 中的隨機數
    開發中我們經常遇到需要隨機數的場景,比如為了用戶密碼更安全我們有時會加鹽,也就是將用戶原密碼連接上一串隨機字符然後加密保存,又比如我們可能需要隨機展示某張圖片等等。今天,我們就來理一理 Python 中的隨機數的玩法,當然,這裡只涉及標準庫。
  • WPA / WPA2加密高速破解的真相
    【IT168專稿】對於無線WPA加密環境,在獲得了WPA握手驗證包後,攻擊者會通過暴力破解模式來進行WPA密碼破解,同時也可以通過事先建立有針對性的字典,然後再進行字典破解(攻擊)。對於大多數無線接入點AP而言,這將會是個行之有效的方法。
  • 什麼是後量子密碼學?高速運行的量子計算機,可能破壞密碼防禦
    HTTPS是一種網絡協議,對我們通過網際網路發送的數據和接收到的響應進行加密。這種加密形式和其他形式的加密保護各種電子通信,以及密碼、數字籤名和健康記錄等內容。量子計算機可能破壞這些加密防禦。雖然量子機器現在還不夠強大,但它們正在快速發展。十多年後,甚至更短的時間內,量子機器可能會對廣泛使用的加密方法構成威脅。
  • Python破解反爬蟲:最新反爬蟲有道翻譯中英文互譯破解,附代碼
    由於爬蟲的出現,導致很多網頁都設置了反爬蟲機制:常見的反爬蟲機制就是在客戶端發出請求的時候,在請求的內容中新增一些內容,而這些內容都是經過「加密的」,每次請求都是不同的,這樣就導致了很多傳統的爬蟲失效。
  • 後量子加密究竟是什麼?
    其目標在於阻止黑客投入大規模算力以暴力破解網站所使用的密鑰。在這方面,目前流行的加密方法主要有RSA加密以及橢圓曲線加密兩種——後者通常使用所謂陷門函數。這是一種數學結構,其從一側能夠以相對輕鬆的方式創建密鑰,但敵對方卻很難從另一側逆推密鑰內容。
  • 密碼的秘密:經典加密方法均已失效
    為了保護那脆弱的秘密,人們會使用密碼,密碼讓機密的內容不會被人偷看,防止秘密落入他人之手,而且也幫助過一代又一代的孩子在課堂上傳遞紙條。密碼的世界籠罩著神秘,也充滿詭計、虛假情報和欺騙,那麼,密碼是何時產生的呢?
  • 王小云:「破解SHA-1後,我是第一個知道世界級秘密的人」
    ,還具有高度的離散性,通常用於密碼的加密儲存。這兩大密碼算法是Hash函數中最重要的兩種,是應用於信息安全領域最關鍵的加密算法,也是目前世界上最先進最難解的。自問世以來,雖然有很多人想要挑戰這個難題,但是都沒什麼太大進展。王小雲最先破譯的是MD5算法,當這個消息傳開後,美國的《華盛頓時報》稱:中國發明的解碼技術,可以威脅到白宮。
  • 王小雲:「破解SHA-1後,我是第一個知道世界級秘密的人」
    破解密碼是一項非常耗費腦力和耐心的工作,但這似乎並沒有難倒我國頂級的密碼分析師王小雲院士,她還在懷孕期間就破譯了美國最難的密碼。 美國的權威科學雜誌甚至用崩潰,密碼學的危機這樣的標題,來形容王小雲獲得的前所未有的成績。 為什麼只是破譯兩個密碼,就會引來如此大的關注呢?
  • 數據加密中的DES加密算法詳解
    信息加密技術是一門涉及數學、密碼學和計算機的交叉學科。現代密碼學的發展,使信息加密技術已經不再依賴於對加密算法本身的保密,而是通過在統計學意義上提高破解的成本來提供高加密算法的安全性。密碼學是一門古老而又年輕的科學,它用於保護軍事和外交通信,可追溯到幾千年前。1976年Diffie和Hellman的「密碼學的新方向」一文引發的密碼學的一場革命,開創了公鑰密碼學的新紀元。