以免将字母用作一次性通行证(使用循环算术)。如果有人得到密文
GUTV
人们对纯文本一无所知,除了它有 4 个字母长。它可以是 BOMB 或 LOVE 或任何其他词。你无法区分,也没有比另一个更有可能。
但是,如果您有两个使用同一个键盘的纯文本,这意味着一旦您采用一种解决方案,就会自动定义第二种解决方案。
使用一些试验和错误(或有词汇的计算机),您可以显着减少最坏的选择。
因此,您可以从完全安全的东西(真正的一次性垫)到容易损坏的东西。
编辑
这是用 python 编写的小破解器 你需要单词文件。我从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')