凯撒移位密码
我正在用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'
这样的东西。
1 个回答
4
"Hello world!"
这个字符串有12个字符,而 "Uryy|-?|yq."
只有11个字符("Hello 2old!"
也是11个字符)。
造成这个情况的原因是字母 w
的新ASCII码是132,而不是119。这个132对应的代码是 '\x84'
。
如果你在IDLE中输入这个字符串,而不是用 print
来输出,而是直接输入变量名,它会显示带有 \x84
的字符串,但如果你用 print
输出,它会把这个字符替换成一个无效的字符。如果你输入的字符串正好是带有 \x84
的,它会返回 "Hello world!"。如果你对 \x84
不太理解,我建议你去了解一下字符编码和十六进制。
传统的凯撒密码只对字母进行位移,不包括其他字符,比如标点符号、管道符号和 132
。
A
的字符编码是65(十进制)a
的字符编码是97
根据 维基百科 的介绍,加密和解密的公式是:
"E_n(x) = (x + n) \mod {26}."
还有
"D_n(x) = (x - n) \mod {26}."
分别对应加密和解密。
使用65和97的字符偏移量,按照维基百科的说明进行操作。