【问题标题】: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)。

标签: python encryption caesar-cipher


【解决方案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 的字符偏移量,按照维基百科文章所说的去做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2014-03-07
    相关资源
    最近更新 更多