避免將字母用作一次性傳遞(使用循環算法)。如果一個得到cyper文本
GUTV
人們可以不知道除了它是4個字母長的明文什麼。 它可以是 炸彈或愛或任何其他字。你不能區分,也不可能比另一個更有可能。
但是,如果你有兩個明文使用相同的鍵盤,這意味着一旦你採取一個解決方案,第二個是自動定義。
使用一些試驗和錯誤(或帶有詞彙的計算機),您可以在最差的情況下顯着減少到幾個選項。
所以,你從完全安全的東西(真正的一次性墊子)得到一件容易破碎的東西。
編輯
這裏是小美人在Python writen你需要的話文件。我走如果從http://norvig.com/big.txt
這段代碼也需要兩個字bomb
和love
和使用墊/密碼haha
加密兩者。然後它找出所有可能的密碼,將該密碼對解密爲詞彙中的單詞。
import re
with open("big.txt","r") as f:
words = set(re.findall('[a-z]+', f.read().lower()))
def encrypt(word,password):
add_letters = lambda x,y:chr((ord(x)+ord(y)-2*ord('a'))%26 + ord('a'))
return "".join(add_letters(*i) for i in zip(word.lower(),password.lower()))
def decrypt(word,password):
sub_let = lambda x,y:chr((ord(x)-ord(y)+26)%26 + ord('a'))
return "".join(sub_let(*i) for i in zip(word.lower(),password.lower()))
def crack(a,b):
assert(len(a) == len(b))
w = (i for i in words if len(i) == len(a))
for i in w:
password = decrypt(a,i)
b_plain= decrypt(b,password)
if b_plain in words:
print(i,b_plain,password)
password = "haha"
a="bomb"
b="love"
a_cyper=encrypt(a,password)
b_cyper=encrypt(b,password)
print("cyper",a_cyper,b_cyper)
crack(a_cyper,b_cyper)
輸出:
('cyper', 'iotb', 'soce')
('tomb', 'dove', 'paha')
('bath', 'lack', 'hoau')
('bomb', 'love', 'haha') <---
('vote', 'foch', 'naax')
('reid', 'berg', 'rkly')
('tank', 'dawn', 'pogr')
('felo', 'peur', 'dkin')
('hath', 'rack', 'boau')
('cork', 'moan', 'gacr')
('rath', 'back', 'roau')
('ruth', 'buck', 'ruau')
('bank', 'lawn', 'hogr')
('rake', 'bath', 'rojx')
('mike', 'with', 'wgjx')
('hero', 'rear', 'bkcn')
('comb', 'move', 'gaha')
('foch', 'polk', 'daru')
('foci', 'poll', 'dart')
('both', 'lock', 'haau')
('peri', 'zeal', 'tkct')
('maim', 'warp', 'wolp')
('limb', 'vive', 'xgha')
不完全是兩個密文異,但可以進行暴力攻擊,XORring第一密文,以及第二個與當前,猜到關鍵;如果他們匹配,賓果。 – 2013-09-30 16:34:29
我不是一個加密專家,但是攻擊者不知道其中一個明文是否能夠恢復另一個? – szx
請注意,如果知道多個密文,則該密鑰可以一次強制一個字母 - 此方法不涉及將密文異或在一起。 – ntoskrnl