Шифр Цезаря, созданный из предыдущего (сдвинутого) символа

Ради интереса я пытаюсь запустить шифр Цезаря в строке, где каждый символ смещается на предыдущий символ в строке. Начальный символ, очевидно, не смещается и используется для сдвига второго, второй символ используется в качестве семени для третьего символа и т. д.

Кодирование работает как положено; расшифровка с другой стороны...

key = "a"
word = key + "shop"

print(word)

coded = ""
for i, val in enumerate(word[1:]):
    coded += (chr(((ord(word[i]) + ord(val) - 97) % 26) + 97))

print(key + coded)
encoded = key + coded

decoded = ""
for i, val in enumerate(encoded[1:]):
    decoded += chr(((ord(encoded[i]) - ord(val) - 97) % 26) + 97)

print(key + decoded)

Моя математика кажется (на наивный взгляд) правильной. Есть ли у кодировки какое-то свойство, о котором я не знаю, которое не позволяет отменить это?

Пример вывода с использованием входных данных выше:

ashop
alsow
amqbp

Очевидно, я хотел бы, чтобы amqbp было ashop. Перемещение -97 не помогает (даже не уверен, почему, если бы это было так).

Что мне здесь не хватает?


person Doug Miller    schedule 08.07.2018    source источник


Ответы (1)


Ваш цикл кодирования кажется неправильным. Я ожидаю, что S, смещенный на A, будет T. Но ваш вывод — L. Может быть, попробуйте кодировать za, что должно привести к za, чтобы увидеть, где вы можете пойти не так. Как догадка, похоже, проблема в том, что вы берете модуль кода символа, а не индекс символов в алфавите. Например. Для a вы делаете 97 % 26 вместо 0 % 26.

person Dunes    schedule 08.07.2018