凯撒移位密码

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 的字符偏移量,按照***文章所说的去做。

【讨论】:

以上是关于凯撒移位密码的主要内容,如果未能解决你的问题,请参考以下文章

凯撒密码

FreeCodeCamp之凯撒密码

Caesars Cipher

Caesars Cipher

Caesars Cipher(算法)

FCC 练习 - Caesars Cipher(关于用Unicode查找字符串的操作)