‘Khoor Zruog!’,Caesar 说。
Source: Dev.to
罗马营地的故事
在罗马营地的寂静中,信使在等待——字母表学会了一个秘密的小步伐。烛光微弱,夜色听起来像皮带的摩擦声、盔甲的放下声,以及千百个安静的思绪试图化作明日的计划。信使手里拿着一块小石板;并非所有信息都适合所有人眼目。有些命令需要跨越距离而不被错误之手理解。这时,字母表便进入了故事。
凯撒密码:历史与原理
事实证明,字母表既容易教会,又难以闲聊。你只需要让它走一定的步数。恰恰是尤利乌斯·凯撒这么做了。我们之所以称之为 Caesar Cipher(凯撒密码),并不是因为他发明了字母位移的概念,而是因为他是最早被记载使用它来保护私人和军事通信的著名人物。
罗马史学家苏埃托尼乌斯描述凯撒通过位移字母来写机密笔记,以至于“没有一个词能够辨认”,并且他甚至解释了规则:用 D 代替 A,随后依此类推。那句 “D 代替 A” 的细节就是一次性透露的全部秘密:位移 3。
A → D
B → E
C → F
…
当你到达字母表的末尾时,会再次回到开头。凯撒据说用这种方式向将军们发送战场指令,并向可信的朋友发送私人信件——这些信息既让拦截者感到烦恼,也更难被随意阅读。
在当时,这种密码比现代耳朵听起来要更有效,原因有两个实际因素:
- 识字率有限。
- 系统化的破译技术尚未成为常规手艺。
频率分析——破解许多简单密码的 “啊哈” 手段——在 9 世纪才由阿尔‑金迪提出。苏埃托尼乌斯还指出,凯撒的继任者奥古斯都使用了更温和的位移 1(B 代替 A,C 代替 B…)。在某些记载中,奥古斯都并未环绕回首;他没有把 Z 变成 A,而是据说把 Z 写成 AA。
将凯撒密码搬到 Python
两千年后,篝火变成了笔记本电脑的屏幕,信使变成了函数调用,而字母表仍然在我们要求时行走。下面是一段简洁的 Python 实现,能够使用凯撒位移对信息进行加密和解密。
def caesar_cipher(text, shift, encrypt=True):
if not isinstance(shift, int):
return 'Must be an integer.'
if shift > 26:
return 'Must be between 1 and 26.'
if not encrypt:
shift = -shift
abc = 'abcdefghijklmnopqrstuvwxyz'
abc_shift = abc[shift:] + abc[:shift]
t = str.maketrans(abc + abc.upper(),
abc_shift + abc_shift.upper())
return text.translate(t)
def encrypt(text, shift):
return caesar_cipher(text, shift)
def decrypt(text, shift):
return caesar_cipher(text, shift, encrypt=False)
print(encrypt('Hello World!', 3)) # Output: Khoor Zruog!
print(decrypt('Khoor Zruog!', 3)) # Output: Hello World!
代码工作原理
- 验证 – 函数确保位移是整数且在 1 到 26 之间。
- 方向 – 如果
encrypt为False,则取相反数,使同一例程变为解密算法。 - 字母表设置 –
这创建了一个“循环”,当字母越过 Z 时会回到 A。abc = 'abcdefghijklmnopqrstuvwxyz' abc_shift = abc[shift:] + abc[:shift] - 翻译表 –
同时处理小写和大写字符。t = str.maketrans(abc + abc.upper(), abc_shift + abc_shift.upper()) - 应用翻译 –
text.translate(t)让每个字符走过位移后的字母表。
辅助函数 encrypt 和 decrypt 只是薄薄的包装,用来设置相应的标志。