在破譯密碼時可能會有上千個可能的密匙,計算機會因此給出各種各樣的結果。那麼怎麼找出唯一明文呢?如果讓計算機先判斷結果中是亂碼還是英文篩選一遍,再將可能的結果交給我們,會不會比人為翻查上千個結果好很多呢?
判斷英文的方法:
我們可以製作乙個包含所有英文單詞的文字檔案(字典檔案),通過計算機將解密後的字串分割成單詞(利用空格),在依次查詢字典檔案中是否有這個單詞。通過如此可以判斷是單詞還是亂碼。
當然了,正確解密完成後不可能所有的都是單詞,比如「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 個嗎,嚇人啊,我當時太糊塗了 京東面試時候說衝突咋辦呢 這...