用蛮力打破凯撒密码

时间:2015-11-09 00:15:48

标签: python caesar-cipher

前两个功能是我的:

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'

2 个答案:

答案 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)

代码破解!好极了!打破caeser密码的最简单方法是假设您的编码文本代表了它在字母频率方面的实际语言。在英语中,相对频率看起来有点像:

"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。关于输入文本的假设。我会把它作为练习留给学生找出逻辑错误,并想一想可以做些什么微小的改变来确保任何输入的结果。作为提示:尝试旋转然后解密以下短语:

  朱迪我不认为你和这个男人联系这样一个神射手是对的,因为没有警告这个神射手可以射杀你。