用蛮力解码密文

时间:2015-11-10 01:00:17

标签: python encryption brute-force

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'

如果给定的整数大于26,则上述函数将重置字母表(因此带键1的字母z等于a)。

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)
assert Caesar_decrypt('Cat', 29) == Caesar_decrypt('Cat', 3)
assert Caesar_decrypt('Good night', 0) == 'good night'
然后,

Caesar_decrypt使用旋转的函数来解密给定的文本字符串。但是,我尝试在没有密钥的情况下解密给定文本,这将是我的下一个功能:Caesar_break。

word = open('wordlist.txt', 'r')
dictionary = word.readlines()
def Caesar_break(code: str) -> str:
    alist = []
    for x in range(26):
        a = Caesar_decrypt(code, x)
        alist += a
    for i in dictionary:
        if i in alist:
            return i

***注意:wordlist.txt只是一个包含所有词典单词的文档。请参阅http://www.ics.uci.edu/~kay/wordlist.txt。所以我想知道为什么当我测试出Caesar_break代码时,shell窗口并没有返回任何内容。我该如何修复代码?谢谢!

如果我的话容易混淆,这是该函数应该如何工作的一个例子:

Caesar_decrypt('mjqqt', 5) == 'hello'

使用Caesar_break,上面的断言看起来像:

Caesar_break('mjqqt') == 'hello' 

(两者都等于'你好')

换句话说,我需要Caesar_break来解码没有5的消息。

1 个答案:

答案 0 :(得分:0)

与你的版本没那么不同,我只是改变了一些东西,如果在for-in内找到了这个词,那么我们就会返回这个词。请注意,我没有将方法大都化,以实现惯例。

with open('wordlist.txt') as words:
    dictionary = frozenset(map(str.strip, words))

def caesar_break(code: str):
    for x in range(26):
        word = caesar_decrypt(code, x)

        if word in dictionary:
            return word