前两个功能是我的:
def rotated(n: int):
'''Returns a rotated letter if parameter is greater than 26'''
ALPHABET = 'abcdefghijklmnopqrstuvwxyz'
if n >= 26:
n %= 26
return ALPHABET[n:26] + ALPHABET[:n]
assert rotated(0) == 'abcdefghijklmnopqrstuvwxyz'
assert rotated(26) == 'abcdefghijklmnopqrstuvwxyz'
def Caesar_decrypt(text: str, key: int) -> str:
'''Returns a decryption of parameter text and key'''
text = text.lower()
key_to_zero = str.maketrans(rotated(key),rotated(0))
return text.translate(key_to_zero)
但是我的合伙人参与了第三项工作:
def Caesar_break(code: str)-> str: 'Decrypts the coded text without a key' file = open('wordlist.txt', 'r') dic = [] dlist = file.readlines() wl = [] l = [] cl = [] swl = [] sw = '' for words in code: if words.isalnum() or words.isspace(): l.append(words) else: l.append(' ') Ncode = ''.join(l) codelist = Ncode.split() high = 0 for i in range(1,27): highesthit = 0 hit = 0 out = Caesar_decrypt(Ncode, i) e = 0 l = 0 while l < len(dlist): dic.append(dlist[l].split()[0]) l += 1 while e < len(dic): if out == dic[e]: hit += 1 e += 1 if hit > highesthit: high = i highesthit = hit return(Caesar_decrypt(Ncode, high))
我现在无法联系他,所以我想知道是否有一种更简单的方法可以使用暴力破解凯撒代码。我的合作伙伴在他的代码中使用了太多随机字母,所以我无法理解它。
注意:“wordlist.txt”是我们下载的文档,其中包含字典中的所有单词。 Here是供参考的链接。
Caesar_break
代码应该像这样工作:
Caesar_break('amknsrcp qagclac') == 'computer science'
答案 0 :(得分:0)
如果您确定使用ceaser(x + 3)mod25加密了密文,您只需浮动字母即可。我会先将所有文本设为小写。然后得到asci值所有的字符。例如asci(a)= 97,使其为97-97 = 0; for b make it 98-97 = 1.然后我会为字符制作2个数组1,为chracters的整数值制作1个数组....
答案 1 :(得分:0)
"etaoinshrdlcumwfgypbvkjxqz"
# most to least common characters in English according to
# https://en.wikipedia.org/wiki/Letter_frequency
然后,打破Caeser Cipher的最快方法是在加密短语中创建collections.Counter
个字母,找到最常见的一对,并假设每个(依次)为{{1} }。从那里计算你的差异,并应用解密密码。测试它是否有效英语和ta-da!
e
但是,这个代码中有一个微妙的逻辑错误,w.r.t。关于输入文本的假设。我会把它作为练习留给学生找出逻辑错误,并想一想可以做些什么微小的改变来确保任何输入的结果。作为提示:尝试旋转然后解密以下短语:
朱迪我不认为你和这个男人联系这样一个神射手是对的,因为没有警告这个神射手可以射杀你。