2015-11-10 2 views
1
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 (поэтому буква z с ключом 1 будет равна а).Декодирование зашифрованного текста Brute Force

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, окно оболочки ничего не возвращает. Как я могу исправить код? Благодаря!

Если мои слова сбивают с толку, это пример того, как предполагается, функция работы:

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

Использование Caesar_break, приведенное утверждение будет выглядеть следующим образом:

Caesar_break('mjqqt') == 'hello' 

(оба равны to 'hello')

Другими словами, мне нужен Caesar_break для декодирования сообщения БЕЗ 5.

+0

простите меня, если я просто быть очень глупо сейчас, но я никогда не видел явные объявления типа параметра/возврата в питона ... –

+0

, кроме того, у вас есть проблемы отступов внутри из 'Caesar_break'. Я предполагаю, что 'for x in range (26):' неверно отступом? Кроме того, вы понимаете, что 'wordlist.txt' является массивным файлом, поэтому цикл' for i in dictionary', скорее всего, будет работать в течение длительного времени .... –

+0

Да, я случайно добавил четыре пробела при вставке кода в stackoverflow, Благодарю. Что касается файла списка слов, есть ли способ, чтобы код работал без циклов в течение этого времени? –

ответ

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 
+0

Hm, оболочка также ничего не возвращает, когда я пытаюсь это сделать. –

+0

@RamonHallan, это слово в вашем словаре?? Возможно ли, что вы не разбирали «словарь» правильно? –

+0

A'asia в словаре, да, но когда я попробовал снова копировать ваш точный код, он больше ничего не возвращал. –