凯撒移位密码
Posted
技术标签:
【中文标题】凯撒移位密码【英文标题】:Caesar shift cypher 【发布时间】:2014-09-28 19:31:27 【问题描述】:我正在使用 chr()
和 ord()
在 python 中开发一个简单的凯撒密码
这是我的代码:
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'
【问题讨论】:
好的,听起来你对出了什么问题有一个假设......你为什么不测试它? 你考虑过溢出吗? Caesar cypher in Python 的可能重复项 一个奇怪的问题是Hello World!
有 12 个字符,而密文 (@987654331@) 只有 11 个字符。那么解密的文本也有11个。那么,第一个问题是“哪个角色失踪了,为什么失踪”?
我猜这取决于您对“正常”字符的定义。它是一个完全正常的字节,但在 8859-x 代码集中对应于 C1 控制字符(准确地说是 IND;C1 控制 (0x80 - 0x9F) 来自 ISO/IEC 6429:1992)。在某些 Windows 代码页(例如 CP1252)中,0x84 对应于打印字符(U+201E DOUBLE LOW-9 QUOTATION MARK for CP1252)。
【参考方案1】:
"Hello world!"
是 12 个字符,但 "Uryy|-?|yq."
是 11("Hello 2old!"
也是)。
造成这种情况的原因是w
的新ASCII码是132而不是119。这是'\x84'
码。
如果您在 IDLE 中执行此操作,而不是 print
,只需键入变量,它会输出带有 \x84
的字符串,但如果您打印它,它会用无效字符替换它。如果您输入准确的字符串(使用\x84
),它将返回“Hello world!”。如果你看不懂\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 的字符偏移量,按照***文章所说的去做。
【讨论】:
以上是关于凯撒移位密码的主要内容,如果未能解决你的问题,请参考以下文章