Python密碼學 檢測英文及破譯換位加密

2021-09-18 01:13:21 字數 4131 閱讀 6385

在破譯密碼時可能會有上千個可能的密匙,計算機會因此給出各種各樣的結果。那麼怎麼找出唯一明文呢?如果讓計算機先判斷結果中是亂碼還是英文篩選一遍,再將可能的結果交給我們,會不會比人為翻查上千個結果好很多呢?

判斷英文的方法:

我們可以製作乙個包含所有英文單詞的文字檔案(字典檔案),通過計算機將解密後的字串分割成單詞(利用空格),在依次查詢字典檔案中是否有這個單詞。通過如此可以判斷是單詞還是亂碼。

當然了,正確解密完成後不可能所有的都是單詞,比如「ae86」總不能是單詞吧!所以我們需要判斷前處理一下字串將非字母的去掉。剩下的如果大多數是單詞則判斷為正確的英文。

所需的字典檔案: 提取碼:wlnp

#detectenglish.py

upperletters =

'abcdefghijklmnopqrstuvwxyz'

letters_and_space = upperletters + upperletters.lower()+

' \t\n'

dictionaryfile =

open

('dictionary.txt'

) englishwords =

for word in dictionaryfile.read(

).split(

'\n'):

englishwords[word]

=none

dictionaryfile.close(

)return englishwords

english_words = loaddictionary(

)#返回單詞佔比

defgetenglishcount

(message)

: message = message.upper(

) message = removenonletters(message)

possiblewords = message.split(

)if possiblewords ==

:return

0.0 matches =

0for word in possiblewords:

if word in english_words:

matches +=

1return

float

(matches)

/len

(possiblewords)

#去除非字母項

defremovenonletters

(message)

: lettersonly =

for symbol in message:

if symbol in letters_and_space:

return

''.join(lettersonly)

defisenglish

(message,wordpercentage=

20,letterpercentage=85)

: wordmatch = getenglishcount(message)

*100

>= wordpercentage

numletters =

len(removenonletters(message)

) messageletterspercentage =

float

(numletters)

/len

(message)

*100

lettermatch = messageletterspercentage >= letterpercentage

return wordmatch and lettermatch

做乙個小測試:

結果為:

在這裡removenonletters()函式是去除非字母項,如"first1"變為"first";

而getenglishcount()函式是返回字串中單詞的佔比,以便後面isenglish()函式判斷;

isenglish是通過單詞的佔比和英文在message中的佔比來判斷該字串是否是英文。顯然這裡的message單詞數量超過了20%是正確的。

知道了如何鑑別是否英文,接下來就能利用計算機輕鬆的破譯了:

所需嘗試的密匙也並非無窮大,範圍是從1和訊息長度之間的整數。利用for迴圈依次嘗試各種密匙下的結果是否滿足isenglish()條件

import detectenglish,transpositiondecrypt

defmain()

: mymessage =

'''dtehry ebyo aaoeseonwdntuvstu』ho ere wrtaiy ries tnoooyseew gunw nloo . nda frtb b a y rhecerybooyetoae.aun rtntc t laseciostayb renruln.oa ngdcedurtt sc '''

key,hackedmessage = hacktransposition(mymessage)

if hackedmessage ==

none

:print

('failed to hack encryption'

)else

:print

('finally key:%s'

%(key)

)print

(hackedmessage)

defhacktransposition

(message)

:print

('hacking...'

)for key in

range(1

,len

(message)):

#print('trying key #%s...' %(key))

decryptedtext = transpositiondecrypt.decryptmessage(key,message)

if detectenglish.isenglish(decryptedtext)

:print

('possible:'

)print

('key %s: %s'

%(key,decryptedtext[

:100])

)print()

#判斷是否正確,正確則全部顯示

print

('enter d for done, or just press enter to continue hacking...'

) response =

input

('>'

)if response.strip(

).upper(

).startswith(

'd')

:return

(key,decryptedtext)

return

none

,none

#兩個被賦值

if __name__ ==

'__main__'

: main(

)

需要的transpositiondecrypt.py見:

結果

在這裡把可能的結果前100個字元顯示讓操作者判斷是否正確。如果回車則錯誤繼續破譯,d則結束破譯,顯示全部結果:

don』t worry about what others are doing better than you. concentrate on beating your own records every day. success is a battle between you and yourself only.(不要擔心別人會做得比你好。你只需要每天都做得比前一天好就可以了。成功是一場和自己的比賽。)

密碼學常用英文單詞翻譯

索引fghijk 索引lmnopq 索引rstuvwxy adaptive chosen attack 自適應選擇攻擊 advantage 優勢 adversary 敵手a,常用來表示偽造方。algebraic 代數學的 arithmetic 算術的 authenticity 真實性.n authe...

《Python密碼學程式設計》 導讀

有很多書教初學者如何使用加密法寫秘密訊息,有一些書教初學者如何破譯加密法。據我所知,還沒有書教初學者如何編寫程式來破譯加密法。這本書填補了這個空缺。本書適合不懂加密 破譯或密碼學的初學者。本書的加密法 除了最後一章的rsa加密法 都有數百年歷史了,現代計算機的計算能力可以破譯使用它們加密的資訊,現代...

1密碼學及加密貨幣概述

1.2 雜湊指標及資料結構 三特性 能有效計算,對輸入字串,合理時間內可算出 必然會有大量可能的輸入被對映到任意特定輸出 見圖1.2 一些數對必將產生碰撞。如果用這個函式作為hash表的話,那 的我這個hash表不得有2 2562 2256 個嗎,嚇人啊,我當時太糊塗了 京東面試時候說衝突咋辦呢 這...