27.Python密碼學入門六:手把手破解一首簡單替換加密後的英文詩

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

用一首著名的英文詩,手把手演示如何破解簡單替換加密。

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

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

上篇說到,李雷用凱撒加密,仿射加密給Kate寫信,都被父母輕鬆破解了。

李雷只好放大招,使用了簡單替換加密。

因為簡單替換加密有403291461126605635584000000個不重複的秘鑰!即使電腦一秒鐘可以嘗試1000萬次,暴力破解也需要120萬年

在信裡,李雷抄了一首著名的英文詩,加密之後如下。

有興趣的話,可以先不看後面的內容,試著去破解它。

Tgm fiztgmqt usqtycam sc tgm klzru

Sq clt vmtkmmc rsfm ycu umytg

Vit kgmc S qtycu sc fzlct lf xli

Xmt xli ulc't wclk tgyt S rlom xli.

Tgm fiztgmqt usqtycam sc tgm klzru

Sq clt kgmc S qtycu sc fzlct lf xli

Xmt xli ayc't qmm nx rlom

Vit kgmc iculivtrx wclkscp tgm rlom fzln vltg

Xmt aycclt vm tlpmtgmz.

Tgm fiztgmqt usqtycam sc tgm klzru

Sq clt vmscp yeyzt kgsrm vmscp sc rlom

Vit kgmc S eryscrx aycclt zmqsqt tgm xmyzcscp

Xmt ezmtmcuscp xli gyom cmomz vmmc sc nx gmyzt.

Tgm fiztgmqt usqtycam sc tgm klzru

Sq clt qtzipprscp ypyscqt tgm tsumq

Vit iqscp lcm'q scusffmzmct gmyzt

Tl usp yc icazlqqyvrm zsomz

Flz tgm lcm kgl rlomq xli

Python實現簡單替換加密?

簡單替換加密的原理很簡單。

就是給26個英文字母都挑選一個替換的字母。

字母A,可以從A~Z,26個字母裡任意挑一個,有26種可能。

假設挑選了字母 X 來替換 A。

字母B,不能再挑選X,只能從剩下的25個字母裡挑選,所以有25種可能。

……

以此類推,一共有

26*25*24*……*1 = 403291461126605635584000000種可能。

假設我們這次挑選的字母替換關係如下

我們用它來加密愛爾蘭著名詩人葉芝的詩《當你老了》中的第一句

When you are old and grey and full of sleep

message = 'When you are old and grey and full of sleep'

source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

key = 'XRMAFGZBWDCEHOIVLKTJNYSQPU'

entry = ''

for i in range(len(message)):

if message[i].isalpha():

if message[i].islower():

entry += key[source.find(message[i].upper())].lower()

else:

entry += key[source.find(message[i])]

else:

entry += message[i]

print(entry)

上面的程序,就是逐一遍歷這句詩的每一個字母。

通過find函數找到字母在正常字母表source裡的位置,

然後把它替換成密文字母表key裡位置相同的字母。

可見,簡單替換加密的實現很簡單。

但是破解缺需要一些技巧。

第一招:字母頻率

在例子中,詩句的原文

When you are old and grey and full of sleep

出現得最多的字母是 e,一共出現了6次,其次是字母 l,出現了4次。

而加密之後的密文

Sbfo pin xkf iea xoa zkfp xoa gnee ig teffv

出現的最多的字母是f,也出現了6次。

道理很簡單,因為原文中所有的e都替換成了f。

所以,我們有了一個大膽的猜想,如果英文裡,每個字母出現的頻率是固定的。

比如說在所有的英文裡,字母e是出現頻率最高的,那麼是不是只要找出密文裡出現次數最多的那個字母,它對應的明文一定就是字母e呢?

這就是破解簡單替換加密的第一招。

如下圖,密碼學家通過對海量的英文文章進行統計,發現26個英文字母出現的頻率順序如下。

ETAONRISHDLFCMUGYPWBVKJXQZ

不過,字母頻率只能用來做參考。

比如上的密文

Sbfo pin xkf iea xoa zkfp xoa gnee ig teffv

f出現了6次,頻率最高,對應 e,是正確的。

但是密文裡出現次數第2多的是 e,如果按照字母頻率的順序,它應該對應字母 t,但實際上,它對應的明文是 l 。

很顯然,文章越長,字母頻率越準確,文章越短,不確定性就越大。

當然,也有例外。

比如在法文裡,出現得最多的字母也是e,但是法國著名作家George Perec就寫了一本小說《La Disparition》(消失),裡面一個字母e都沒有。

試著用第一招來破解

不妨試一試用字母頻率來進行破解。

先把密文保存成文件 mail.txt

接下來就是統計密文裡每個字母出現的頻率

count = {}

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

lines = fr.readlines()

for line in lines:

for i in range(len(line)):

if line[i].isalpha():

if line[i].upper() in count:

count[line[i].upper()] += 1

else:

count[line[i].upper()] = 1

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

result = ''

for i in count:

result += i[0]

print(result)

執行程序,得到密文裡字母的頻率排序是

MTCLSGZQYIURXFKVPAONEW

可以試著把密文裡的每個字母按頻率進行替換。

ETAONRISHDLFCMUGYPWBVKJXQZ

也就是說密文裡的字母 M替換成 字母 E,密文裡的字母 T 替換成字母 T ……

但是,最後破解出來的結果如下,顯然不正確。

第二招:單詞模式

先來看例詩中的一個單詞 sleep

如果我們用下面的方法來表示這個單詞

第一個出現的字母 s,記為 0

第2個字母 l,和第一個字母不同,記為 1

第3個字母e,和前2個字母不同,記為 2

第4個字母 e,和第3個字母相同,所以還是記為 2

第5個字母 p,和前面的字母都不同,記為 3

所以,sleep 記為 01223

在我們的例子裡,sleep經過加密之後,密文是 teffv

如果用同樣的方法,teffv 也記為 01223。

我們稱這種方法為單詞模式

很顯然,經過簡單替換加密之後,單詞模式並不會發生改變。

如果我們知道每個英文單詞的單詞模式,那麼,是不是就可以通過單詞模式進行破解呢?

這就是破解簡單替換加密的第二招:單詞模式。

當然,首先你得有所有的英文單詞。

網上並沒有現成的單詞庫,不過好在我們可以通過爬蟲去爬取(爬蟲的知識後面再介紹),如下,已經爬取好了16335個單詞,並保存成了 dic.txt文件。

其次,還得把每個單詞轉成單詞模式。

程序如下,其中 函數 calculate就是專門用來將單詞轉換成單詞模式的。

def calculate(message):

dicTmp = {}

k = 0

result = ''

for i in range(len(message)):

if message[i] not in dicTmp:

dicTmp[message[i]] = k

k += 1

result += str(dicTmp[message[i]])

else:

result += str(dicTmp[message[i]])

return result

dic = {}

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

lines = fr.readlines()

for line in lines:

word = line.strip()

rs = calculate(word)

if rs in dic :

dic[rs] = dic[rs]+','+word

else:

dic[rs] = word

print(dic)

轉換之後的效果如下。

我們看到,單詞模式 0 ,只有單詞 a 和單詞 i 。想一想,一個字母就是一個單詞的是不是就只有這2個字母。

再比如,單詞模式是 0102342的只有一個單詞 abandon

當然,我們也看到,有的單詞模式有很多個單詞,比如 01023

試著用第二招來破解

接下來,我們把密文文件 mail.txt 裡的每一個單詞轉換成單詞模式。

然後從單詞庫裡去找相同單詞模式的單詞。

當然,我們先找那些一個單詞模式只有少量單詞的,比如先限制小於10個單詞。

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

lines = fr.readlines()

for line in lines:

line = line.replace(',','').replace('.','').replace(';','').strip()

words = line.split(' ')

for i in range(len(words)):

re = calculate(words[i])

if re in dic and 0<= dic[re].count(',')<10:

print(re,words[i],dic[re])

執行程序,我們發現,有2個密文單詞,找到了唯一匹配的明文單詞。

分別是

ezmtmcuscp ,單詞模式 0123245647,匹配的明文單詞只有quarantine

scusffmzmct,單詞模式01203345416 ,匹配的明文單詞只有indifferent

根據這2個單詞,就可以開始破解了。

先製作這樣一個表格

根據第一個單詞 ezmtmcuscp對應quarantine,可以填上

再根據第二個單詞scusffmzmct,對應indifferent,可以繼續補充

但是,發現這2個單詞破解出來的字母映射關係不一致。應該怎麼處理呢?

這時,第一招字母頻率就可以發揮作用了。

密文中,字母出現次數排序是MTCLSGZQYIURXFKVPAONEW

而英文中字母出現次數排序是 ETAONRISHDLFCMUGYPWBVKJXQZ

從頻率上分析,m對應的明文字母應該是e,t對應的應該是t,顯然第二個單詞更可信。所以,我們只保留第二個單詞的字母映射。

接下來,繼續看第三個密文單詞tlpmtgmz 它的單詞模式是01230435,可能的單詞有三個sadistic,sidestep,together。

但是根據第二個單詞已經整理出來的映射關係,t-->t,只有單詞together滿足要求。同時根據 tlpmtgmz --> together,又可以多得到 l --> o,p --> g,g--> h

以此類推,可以破解出

有了這麼多字母的映射關係,其實可以試著去破解整首詩了。

密文的第一句是

Tgm fiztgmqt usqtycam sc tgm klzru

用已知的字母映射破解得到

The furthest distance in the wor?d

雖然,密文裡字母r對應什麼字母還不知道,但根據整個句子的意思,很容易就能猜到,完整的句子應該是

The furthest distance in the world

這首詩就是著名的《世界上最遙遠的距離》。

關於這首詩的作者,一說出自張小嫻的小說《荷包裡的單人床》,另一說出自印度著名詩人泰戈爾詩集《飛鳥集》。

黔驢技窮的李雷

連理論上無法破解的簡單替換加密都被破解了,你還能為李雷想到什麼更安全的加密方式嗎?

相關焦點

  • 密碼學——加密者與破譯者的博弈
    這篇文章介紹了密碼學的相關知識,歡迎感興趣的童鞋閱讀。密碼學是網絡安全、信息安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函數等,都屬於密碼學範疇。密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密算法,經歷了古典密碼學,近代密碼學和現代密碼學三個階段。密碼學不僅僅是數學家們的智慧,更是如今網絡空間安全的重要基礎。
  • 後量子時代的密碼學
    後量子時代的密碼學 目前的社會工程、釣魚郵件、勒索軟體攻擊等都是由黑客和傳統計算機完成的,如果黑客擁有一臺量子計算機,那麼將在瞬間完成攻擊,破解銀行帳號密碼竊取資金和信息等。
  • 密碼學 RSA加密與破解
    第一個數字是3,也就是說,總部指示我們,求上面數字串的3次方:原字符串:1   3   8   5   6   8   9   4   5   1   2   5   4三次乘方:1  27 512 125 216 512 729  64 125   1   8 125  64第二步是求餘數
  • 數據加密中的DES加密算法詳解
    信息加密技術是一門涉及數學、密碼學和計算機的交叉學科。現代密碼學的發展,使信息加密技術已經不再依賴於對加密算法本身的保密,而是通過在統計學意義上提高破解的成本來提供高加密算法的安全性。密碼學是一門古老而又年輕的科學,它用於保護軍事和外交通信,可追溯到幾千年前。1976年Diffie和Hellman的「密碼學的新方向」一文引發的密碼學的一場革命,開創了公鑰密碼學的新紀元。
  • Python黑科技:WiFi破解
    Python黑科技:WiFi破解,你家的WiFi又被蹭了嗎?雖然可以重置一下啊,但是咋們不是有Python嗎?昨天給大家講了一下Python破解加密文件的方法,今天就給大家介紹一下Python破解WiFi密碼的方法,其實,我們核心東西都是沒有變的,主要就是讓你們能夠知道Python的相關模塊的用法。
  • 史上最強最燒腦的反竊聽的密碼學:量子秘鑰分發
    電影中總是出現竊聽的情節,正派反派都在用,只是電影中的密碼學比較簡單,也就是高性能軍用的竊聽器而已,而反偵察一般是懷疑後,拿著探測器去找,這是非常弱雞的做法,如何反竊聽? 前面的文章講了很多很多的加密,但是有一個問題沒有解決,就是通信問題,鑰匙複雜到讓別人很難破解是一回兒事兒,比如恩尼格瑪機加密;整體的安全性是另外一回事兒,比如這個加密的鑰匙被別人知道了,這個人是接收者以外的人。
  • 密碼的秘密:經典加密方法均已失效
    象形文字的聯想繪畫圖片凱撒移位法簡單的密碼有兩種:用別的符號、字母和數字代替其他字母的替代密碼;把字母用別的順序編寫的轉換密碼。替代密碼很簡單,比如我可以把這篇文章翻譯成英 語,用英語為這篇文章加密,不過因為英語被大家普遍掌握,使得這種加密方法顯得過於簡單。
  • 古代密碼學與信息安全
    傳說在古希臘時期就用過一種笨辦法——把奴隸的頭髮剃光,在頭上寫字,頭髮長出來後再派出去傳遞秘密情報(奴隸:MD洗頭都不行……),可謂最古老的「加密」了。公元前4世紀的伯羅奔尼撒戰爭期間,希臘人又用了在腰帶上書寫移位後的文字來加密傳遞情報的方法。古羅馬時期發明了「愷撒密碼」,就是把明文中的各個字母換成錯開一定間隔,形成秘文傳遞。
  • 哈希算法和密碼學
    密碼僅僅對文字或者是數碼進行加密和脫密的變化,隨著通信技術的發展,密碼在語言、圖像和數據方面都可進行加密和脫密的轉換。密碼的不斷普及衍生出了密碼學,密碼學是研究編制密碼和破譯密碼的技術科學,在通常情況下,被認為是數學和計算機科學的分支,同時也和資訊理論密切相關。密碼學在傳送信息方面起到了巨大的作用,這也為區塊鏈資產的發展奠定了基礎,比特幣的發展就應用了大量的密碼學知識。
  • 古典密碼學的巔峰之戰:恩尼格碼機
    上述事情若沒有發生,二戰密電戰可能會回到簡單編碼、語義戰的幾千年人類諜戰老路子,英美則不會急迫到在計算理論和硬體上投入巨量的資源,人類資訊時代的推進晚二十多年是正常的。至於為何選擇數學系的學生值得一提,密碼隱藏術在人類歷史上長期等於語言騰挪術,用移位、替換、隱寫的方法傳遞信息,如火星文就用到了替換方法,因此之前密碼破解領域主要是語言學家的天下。
  • 加密算法科普:des、aes加密、對稱、非對稱加密、Hash算法都是啥
    這種特性使得許多錯誤校正碼,例如奇偶校驗位,即使在加密前計算而在加密後進行校驗也可以得出正確結果。每個使用OFB的輸出塊與其前面所有的輸出塊相關,因此不能並行化處理。然而,由於平文和密文只在最終的異或過程中使用,因此可以事先對IV進行加密,最後並行的將平文或密文進行並行的異或處理。可以利用輸入全0的CBC模式產生OFB模式的密鑰流。
  • 加密類型:5種加密算法以及如何選擇正確的算法
    為了保護自己的字母免受他人的注意,他們決定以這樣的方式編寫消息:將消息中的每個字母替換為字母下方七個位置的字母。因此,與其說「 Apple」,不如說是「 hwwsl」(A-> H,P-> W,L-> S,E-> L)。為了將數據恢復為原始格式,他們必須在字母順序的七個位置替換字母。
  • 犯罪大師入門篇2進階答案解析攻略 入門篇2進階密碼破解過程
    犯罪大師入門篇2進階答案解析攻略 入門篇2進階密碼破解過程 犯罪大師的入門篇2進階是需要你破解一個叫做維吉尼亞密碼的表,很多玩家都不清楚這個怎麼破解,下面就來為大家分享一下犯罪大師入門篇2進階答案解析攻略
  • 幾乎無解的最強加密方法,終於被證實真的存在
    來源:環球科學圖片來源:Kiel Mutschelknaus for Quanta Magazine構建無法破解的密碼,是眾多密碼學科學家的目標。一種被稱為不可區分混淆的加密方式因為太過完美,多年來被認為無法實現。不過最近,三名研究者首次證明不可區分混淆是可行的,這或許是通往完美密碼的重要一步。
  • PostgreSQL | 用pg_dumpfile來破解密碼,從入門到放棄
    是不是可以破解密碼呢?今日突然想到pg_filedump是不是也能破解密碼?要想破解密碼,先要了解一下pg_authid表。但加密後的密碼無法登錄到資料庫。[postgres@centos8 pgdata]$ echo -n "Sqlite123" | md5sum 708afc6329d6ce5eec8fef1c54b27259  -我們會發現,計算出的md5值與挖掘出的md5值不同。
  • 區塊鏈中的密碼學系列之對稱加密算法DES(六)
    Feistel網絡我們可以參考這裡,Feistel講解下面簡單說下:Feistel網絡利用乘積密碼實現關鍵密碼模塊。所謂乘積密碼就是順序或循環地執行兩個或多個基本密碼模塊,提高密碼強度。其思想就是Shannon提出的利用乘積密碼實現擴散和混淆。
  • 密碼學家王小雲:十年破解MD5和SHA-1兩大國際密碼
    5年前,四川大學信息安全專業本科生吳彥冰,在閱讀公認世界第一黑客的凱文·米特尼克所著《欺騙的藝術》時,發現一段文字中有個中國人的名字,這是一條關於「MD5已被王小雲教授破解」的注釋。了解這條注釋背後的故事後,吳彥冰被密碼學深深吸引了。畢業前他向王小雲發了郵件,決定探索密碼學這個迷人的世界。如今,他已師從王小雲,漫遊密碼世界。時間回到2004年,對於國際密碼學界來說,這註定是不同尋常的一年。
  • 區塊鏈丨對稱加密算法
    關注「區鏈數科」,讓你從入門到精通區塊鏈!在前面的文章中,有提到「對稱加密算法」,這是一種相對應用得比較早的加密算法之一,其技術也是比較成熟的。雖然都是對稱加密算法,但是它們的不同之處在於分組加密會先將明文數據分為幾段固定長度的數據塊作為基本加密單位,然後再依次對這些數據塊進行加密。而序列加密則每次只對一個字節或字符進行加密,且使用的密鑰也會不斷地發生變化。
  • Python暴力破解凱撒加密的文本
    凱撒加密是一種經典加密算法,把文本中的每個英文字母替換為字母表中後面第k個字母。
  • Web前端慢加密
    但密碼加密不同。算法越快,越容易破。  0x01 暴力破解  密碼破解,就是把加密後的密碼還原成明文密碼。似乎有不少方法,但最 終都得走一條路:暴力窮舉。  也許你會說還可以查表,瞬間就出結果。雖然查表不用窮舉,但表的製造 過程仍然需要。查表只是將窮舉提前了而已。