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

2020-12-10 和孩子一起學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,成功拿到了密碼。

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

相關焦點

  • 萬曆到鹹豐的密碼學:維吉尼亞加密法
    這倒不是開玩笑,因為那個時候歐洲的化學家叫做「鍊金術士」,化學家這個詞要到兩百年之後,化學的祖師爺拉瓦錫先生出生後才有。中國也有鍊金術,比如東晉葛洪、南宋王重陽都是鍊金術士或者煉丹家。中國的煉丹術沒有發展成化學,中國的周易八卦也沒發展成密碼學。所以,過兩百年後要挨打的。
  • 27.Python密碼學入門六:手把手破解一首簡單替換加密後的英文詩
    用一首著名的英文詩,手把手演示如何破解簡單替換加密。百家號不支持代碼格式,文章裡的代碼排版都是亂的。如果需要拷貝代碼,可以去同名微信公眾號。上篇說到,李雷用凱撒加密,仿射加密給Kate寫信,都被父母輕鬆破解了。李雷只好放大招,使用了簡單替換加密。因為簡單替換加密有403291461126605635584000000個不重複的秘鑰!
  • Python 密碼學入門書籍
    今天,就和大家推薦一本免費密碼學編程書籍,還是使用Python程式語言的——《Python密碼學編程》這是是一本有關密碼學、計算機編程和Python程式語言的免費入門教科書,由舊金山的軟體開發人員Albert Sweigert編寫。
  • 密碼學初探:隱藏信息的藝術
    置換法與替換法的安全性較差,古阿拉伯的學者們開創了破譯加密信息的科學——密碼分析學,通過頻率分析的方法破解替換式加密法。在長達一千多年的時間裡,古典密碼學以置換法與替換法為基礎不斷演進。以維吉尼亞密碼為代表的多字母表替換式加密法輪流使用多個不同的替換式密碼錶,依次對明文中的字母進行加密。
  • 《Cypher》評測: 密碼學入門手冊
    走進大門,你發現自己來到了一所聖潔的密碼學歷史博物館。博物館劃分為7個區域——6個主題區域和1個額外挑戰區域,自古老的隱寫術到現代的數字加密,可以說星羅萬象。每個區域門口有一塊巨大的牆體,其正面描述了該區域主題的歷史和加密的機理,並提到了解密這種密文的方式,反面則提供了一些額外可能用到的知識。隨著解密每個區域的密文,你也對密碼學的歷史加深了了解。
  • 犯罪大師入門篇2進階答案解析攻略 入門篇2進階密碼破解過程
    犯罪大師的入門篇2進階是需要你破解一個叫做維吉尼亞密碼的表,很多玩家都不清楚這個怎麼破解,下面就來為大家分享一下犯罪大師入門篇2進階答案解析攻略。維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬於多表密碼的一種簡單形式。維吉尼亞密碼曾多次被發明。
  • python小課堂17 - 30行代碼破解加密ZIP文件
    若有不懂得的地方,請回顧python小課堂1-16。在多數人眼中一直覺得黑客很神秘,實際上當初我學python入門時正是因為那會在學安全相關的東西,機緣巧合得以在360和愛春秋聯合組織的網課中學到了不少安全相關的知識。很早以前,python就被公認為黑客屆的程式語言之一,自身有著強大的第三方庫(也就是包和模塊的統稱)來使用,並且語言上手度非常容易。
  • 密碼學—一場智力的追逐
    密碼學的英語單詞是 Cryptograghy,是由希臘單詞 Kryptos(隱藏)和 Graphin(寫)派生出來的,最初的意思是用來隱秘的傳遞信息。密碼學,從第一代的隱藏法,第二代的移位法和替代法,到第三代的維尼吉亞加密法,到第四代的恩尼格瑪機, 再到第五代的魔王加密系統, 第六代的RSA加密系統, 以及第七代的量子加密。
  • 最全 Python 算法入門
    它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序,因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
  • 科普 | 極簡橢圓曲線密碼學入門
    本文預設讀者的閱讀目的是想知道為什麼 ECC 是一個有效的密碼學工具及其基本原理。我的目標是給出廣義的解釋,我將省略一些證明和實現細節,聚焦於抽象的原理。- 橢圓曲線示例 -ECC 有什麼用途?ECC 是一種加密數據的方法,只有特定的人才能對其進行解密。
  • 犯罪大師入門篇進階答案是什麼?crimaster入門篇進階答案攻略[多圖]
    犯罪大師入門篇進階的答案是什麼呢,遊戲中有很多的小夥伴不知道這一個案件的答案到底是什麼,這次對於玩家的思維考驗是比較大的,我們需要通過各種各樣的線索和無數次的嘗試來找到答案,下面就為大家帶來全新的答案吧。
  • 一文概覽密碼學發展史、基本原理與常見算法
    如果你要成為密碼學家,那可能是的,畢竟密碼學家的工作就是構造極難破解的加密算法。但是加密方法在當今世界的用途已經非常普遍了,從保護用戶的信用卡信息、保護遠程用戶的網絡連接,到保護智力產權、防止盜版,密碼學無處不在。 我這篇文章的目的,就是把令人望而生畏的密碼學轉述成大白話,讓大家都能理解這些方法是如何用來加密數據的。
  • 密碼學有什麼用?
    一、密碼學和信息安全的關係二、密碼學是什麼三、為什麼要學密碼學    3.1國家層面    3.2個人層面四、密碼學學什麼五、密碼學怎麼入門一、密碼學和信息安全的關係先放一張學科分類圖,了解密碼學所在的位置。
  • UK DN AS NN WG UX AA:這是一條加密推送!
    美國頂尖的密碼破解專家William Friedman嘗試破解伏尼契手稿但以失敗告終。2014年,貝德福德大學的Stephen Bax教授聲稱成功破譯部分手稿。他通過分析中世紀的草藥書籍,破解出一些符號的可能含義。2017年ACL大會上,阿爾伯塔大學的團隊發表論文稱,AI算法破解出手稿是用加密的希伯來語寫成,且計算機科學家正與古希伯來語學家合作解讀手稿內容。
  • 十分鐘學密碼學
    通行口令,或曰「密碼」是生活裡常見的安全措施,是一種密碼學的最佳實踐。也就是說,這種方法用起來很方便。但它不是嚴肅的密碼學範疇。老百姓說起密碼學,第二個聯想是加密,信息加密。這個好理解。這個確實是密碼學的重要內容。《福爾摩斯探案集》小說裡有一個故事,叫《跳舞的小人》。這個故事講解了經典密碼學的常識。
  • 密碼學基礎之一:對稱加密
    前言密碼學方面的書籍文獻很多很多,這些書籍很多都是英文的,而且假定讀者有一些數學基礎,對於非專業讀者來說
  • 區塊鏈和密碼學有何關係?
    比如A有份秘密文件傳給B,首先通過加密算法把文件轉換成密文,密文就是一些看起來不知所云的內容。B收到密文後,通過對應的解密算法,就可以把密文再轉換成數據。 將軍收到密文後,根據同樣的算法和 key 反推就可以解密。 隨著電氣革命興起,發明了專門用於加密的硬體器材。但是真正密碼學的大發展是在計算機興起之後,尤其是網際網路的到來。
  • GitHub超2.7萬星,最全Python入門算法來了
    不同之處在於,冒泡排序是從低到高比較序列裡的每個元素,而雞尾酒排序從兩個方向(低到高、高到低)來回排序,效率更高。加密算法凱撒密碼凱撒密碼(英語:Caesar cipher),或稱凱撒加密、凱撒變換、變換加密,是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。
  • 5種方法,加密你的Python代碼
    其中一個缺點,讓不少開發者頭疼不已,由於Python解釋器開源的關係,導致Python代碼無法加密,代碼的安全性得不到保障。當然,想要加密Python代碼,也並非無解。最常見的加密方式有4種,還有1種獨特的加密方式。
  • 乾貨學習——密碼學之塊加密
    下圖為經典ECB加密模式示例,比如DES算法採用一個64位的密鑰Key,如果採用該模式加密,就是將要加密的數據分成每組64位的數據Mm,如果最後一組不夠64位,那麼就補齊為64位,然後每組數據都採用DES算法Ek和64位密鑰Key進行加密,得到每組數據的加密結果Cm,每一組Cm合併後的結果即為DES在ECB加密模式後得到的密文。