Цезарный сдвиг cypher

Я работаю над простым Caesar Cipher в python, используя chr() и ord()

Вот мой код:

  key = 13 newString = '' if mode == 'decrypt': key = -key for c in message: newString += chr(ord(c) + key) print newString 

Но что-то смешное случается!

Когда я ввожу: "Hello world!" , Я возвращаюсь "Uryy|-?|yq."

Выглядит правильно, да?

Но когда я пытаюсь расшифровать его,

Я получаю: Hello 2old!

Какие-нибудь идеи? Я думаю, что это связано с chr() возвращающим что-то вроде этого: '\x84'

    "Hello world!" составляет 12 символов, но "Uryy|-?|yq." составляет 11 (и так далее "Hello 2old!" ).

    Причиной этого является то, что новый код ASCII w равен 132 вместо 119. Который является кодом '\x84' .

    Если вы сделаете это в IDLE и вместо print просто введите переменную, она \x84 строку с \x84 , но если вы ее распечатаете, она заменит ее недопустимым символом. Если вы вводите точную строку (с помощью \x84 ), она возвращает «Hello world!». Если вы не понимаете \x84 я предлагаю вам \x84 коды символов и шестнадцатеричные.


    И традиционный сдвиг Цезаря держит всех символов в виде букв, а не других, таких как знаки препинания, трубы и 132 .

    • A имеет код символа 65 (в десятичной форме)

    • a – 97

    Согласно http://en.wikipedia.org/wiki/Caesar_cipher , шифрование и дешифрование:

    "E_n (x) = (x + n) \ mod {26}."

    а также

    "D_n (x) = (x – n) \ mod {26}."

    соответственно.

    Используйте смещения символов 65 и 97 и сделайте то, что говорит статья в Википедии.