凯撒移位密码

2 投票
1 回答
621 浏览
提问于 2025-04-18 16:10

我正在用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的字符偏移量,按照维基百科的说明进行操作。

撰写回答