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

2020-12-08 和孩子一起學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

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

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

黔驢技窮的李雷

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

相關焦點

  • 29.Python密碼學入門之八:手把手破解維吉尼亞加密後的英文詩
    同時,也不能像破解簡單替換加密那樣,通過計算字母出現的頻率,和字母的單詞模式來破解,因為經過維吉尼亞加密之後,字母頻率和單詞模式都變化了。上一篇的最後,給了一首經過維吉尼亞加密之後的英文詩,這一篇,我們就來演示如何來破解這首詩。
  • Python 密碼學入門書籍
    今天,就和大家推薦一本免費密碼學編程書籍,還是使用Python程式語言的——《Python密碼學編程》這是是一本有關密碼學、計算機編程和Python程式語言的免費入門教科書,由舊金山的軟體開發人員Albert Sweigert編寫。
  • 解題有獎#9 | 簡單替換密碼,對暴力破解「Say NO」
    那麼,為了增加計算成本,使得這種窮舉的思路計算量巨大,慢慢就演變成了我們現代的密碼學,或者說計算機時代的密碼學。今天,我們講講同樣有著悠久歷史的替換式密碼(Substitution Cipher)。 01 替換式密碼替換式密碼,可以簡單分為兩類:單表密碼和多表密碼。這期先講講單表密碼,又稱簡單替換密碼(Simple Substitution Cipher)。簡單替換,顧名思義,就是通過替換而非移位的思路,進行密文撰寫。
  • 萬曆到鹹豐的密碼學:維吉尼亞加密法
    請認真看,文中的舉例是我自己在Excel表格中做出來的,為的是簡單明了,你一看就明白了。 本文將從法國外交官講到鍊金術士,從明朝萬曆十五年講到鹹豐十年,認真的。——前言 頻率分析法出來後,移位和替換法不好用了,那麼怎麼才能消解掉這種概率呢?
  • 《Cypher》評測: 密碼學入門手冊
    走進大門,你發現自己來到了一所聖潔的密碼學歷史博物館。博物館劃分為7個區域——6個主題區域和1個額外挑戰區域,自古老的隱寫術到現代的數字加密,可以說星羅萬象。每個區域門口有一塊巨大的牆體,其正面描述了該區域主題的歷史和加密的機理,並提到了解密這種密文的方式,反面則提供了一些額外可能用到的知識。隨著解密每個區域的密文,你也對密碼學的歷史加深了了解。
  • 密碼學初探:隱藏信息的藝術
    根據以RSA為代表的公鑰加密體系的出現,可以將密碼學的發展過程分為古典密碼學與現代密碼學兩部分。古典密碼學以「置換法」與「替換法」為基礎,多應用於軍事與情報領域;現代密碼學則建立在數學、計算機與通信科學的基礎上,除了加密信息之外,數字籤名、數據完整性、身份認證等也是現代密碼學的研究課題。
  • 十分鐘學密碼學
    通行口令,或曰「密碼」是生活裡常見的安全措施,是一種密碼學的最佳實踐。也就是說,這種方法用起來很方便。但它不是嚴肅的密碼學範疇。老百姓說起密碼學,第二個聯想是加密,信息加密。這個好理解。這個確實是密碼學的重要內容。《福爾摩斯探案集》小說裡有一個故事,叫《跳舞的小人》。這個故事講解了經典密碼學的常識。
  • 解題有獎#10 | 簡單替換密碼(下篇):頻率分析武器
    ——愛因斯坦在上周的《解題有獎#9 | 簡單替換密碼,對暴力破解「Say NO」》中,我們談到了「簡單替換密碼」。今天,我們繼續上周的話題,給大家介紹簡單替換密碼的破解。 01 頻率分析武器密碼學發展至今已有幾千年了,這其中最重大的發展來源於公元750年後的伊斯蘭文化鼎盛時期。在這段時期,穆斯林的學者發現,每種語言的字母都是以一個較為固定的頻率出現的。那麼這種頻率是否也可以應用於破解密碼呢?
  • python小課堂17 - 30行代碼破解加密ZIP文件
    若有不懂得的地方,請回顧python小課堂1-16。在多數人眼中一直覺得黑客很神秘,實際上當初我學python入門時正是因為那會在學安全相關的東西,機緣巧合得以在360和愛春秋聯合組織的網課中學到了不少安全相關的知識。很早以前,python就被公認為黑客屆的程式語言之一,自身有著強大的第三方庫(也就是包和模塊的統稱)來使用,並且語言上手度非常容易。
  • 密碼學基礎之一:對稱加密
    加密操作將明文數據與加密密鑰做一次加密操作,加密操作可能為:(1)    按位異或(2)    替換(3)    移位(4)    或以上三者的任意組合操作 解密操作將密文數據與解密密鑰做一次解密操作
  • 科普 | 極簡橢圓曲線密碼學入門
    本文旨在簡單介紹橢圓曲線密碼學(elliptic curve cryptography)。
  • 區塊鏈中的那些密碼學
    算法的安全性被攻破有兩種可能:算法本身的漏洞,不需要密鑰就能破解算法;在可接受的時間範圍內暴力破解。各加密算法特點1.古典密碼學:其算法歸根結底主要有兩種,即:置換和替換;其安全性依賴於算法的保密性,整體安全性不高。
  • 一文概覽密碼學發展史、基本原理與常見算法
    這種字符替換型加密方法(cipher)被稱為 「凱撒密碼」,可能是文獻中最常提到的人類曾用過的加密方法。(所謂 「cipher」,就是用來加密或者解密的算法)。所謂 「字符替換型加密方法」,就是把明文(我們想要加密的消息)中的每個字母都換成另一個字母,形成密文(即被編碼過的消息)。
  • 看我如何輕鬆破解加密PDF!
    文中將介紹如果利用開源工具、python代碼等秒破加密的pdf文件。為了保證pdf文件的機密性可以對文件進行加密,而用user密碼加密的pdf文件需要提供加密密碼才可以打開。而owner密碼加密的pdf文件可以不提供密碼打開,但是打開後的pdf文件會有一些限制,比如不能列印等。QPDF是一款用於確定pdf文件機密的方式。
  • 密碼學有什麼用?
    一、密碼學和信息安全的關係二、密碼學是什麼三、為什麼要學密碼學    3.1國家層面    3.2個人層面四、密碼學學什麼五、密碼學怎麼入門一、密碼學和信息安全的關係先放一張學科分類圖,了解密碼學所在的位置。
  • 5種方法,加密你的Python代碼
    Python優點很多,比如簡單易學,代碼量少,能做的事很多等等,和其他語言一樣,Pyhton也有一些不可掩蓋的缺點,版本不兼容,運行效率不高等等。其中一個缺點,讓不少開發者頭疼不已,由於Python解釋器開源的關係,導致Python代碼無法加密,代碼的安全性得不到保障。當然,想要加密Python代碼,也並非無解。
  • Python開發簡單爬蟲【學習資料總結】
    一、簡單爬蟲架構 URL管理器返回是/否; 2、如果是,調度器會從URL管理器中取出一個待爬URL; 3、調度器將URL傳給下載器,下載網頁內容後返回給調度器; 4、調度器再將返回的網頁內容發送到解析器,解析URL內容,解析完成後返回有價值的數據和新的URL; 5、一方面,調度器將數據傳遞給應用進行數據的收集
  • CRYPTO : AES加密
    ,即僅僅使用明文和密鑰來加密數據,相同的明文塊會被加密成相同的密文塊,這樣明文和密文的結構將是完全一樣的,就會更容易被破解,相對來說不是那麼安全,因此很少使用。使用隨機數產生的初始向量才能達到語義安全(消息驗證碼也可能用到初始向量),並讓攻擊者難以對原文一致且使用同一把密鑰生成的密文進行破解。密鑰在密碼學中,密鑰(key)是指某個用來完成加密、解密、完整性驗證等密碼學應用的秘密信息。在對稱密碼學中,加密和解密用的是同一個鑰匙,因此鑰匙需要保密。
  • 乾貨學習——密碼學之塊加密
    >1、電子編碼薄ECB是最早採用和最簡單的模式,它將加密的數據分成若干組,每組的大小跟加密密鑰長度相同,然後每組都用相同的密鑰進行加密,由於其分組的獨立性,利於實現並行處理,並且能很好地防止誤差傳播。下圖為經典ECB加密模式示例,比如DES算法採用一個64位的密鑰Key,如果採用該模式加密,就是將要加密的數據分成每組64位的數據Mm,如果最後一組不夠64位,那麼就補齊為64位,然後每組數據都採用DES算法Ek和64位密鑰Key進行加密,得到每組數據的加密結果Cm,每一組Cm合併後的結果即為DES在ECB加密模式後得到的密文。
  • 區塊鏈和密碼學有何關係?
    比如A有份秘密文件傳給B,首先通過加密算法把文件轉換成密文,密文就是一些看起來不知所云的內容。B收到密文後,通過對應的解密算法,就可以把密文再轉換成數據。 將軍收到密文後,根據同樣的算法和 key 反推就可以解密。 隨著電氣革命興起,發明了專門用於加密的硬體器材。但是真正密碼學的大發展是在計算機興起之後,尤其是網際網路的到來。