‘Khoor Zruog!’,Caesar 说。

发布: (2026年2月4日 GMT+8 18:23)
5 分钟阅读
原文: Dev.to

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. 验证 – 函数确保位移是整数且在 1 到 26 之间。
  2. 方向 – 如果 encryptFalse,则取相反数,使同一例程变为解密算法。
  3. 字母表设置
    abc = 'abcdefghijklmnopqrstuvwxyz'
    abc_shift = abc[shift:] + abc[:shift]
    这创建了一个“循环”,当字母越过 Z 时会回到 A
  4. 翻译表
    t = str.maketrans(abc + abc.upper(),
                     abc_shift + abc_shift.upper())
    同时处理小写和大写字符。
  5. 应用翻译text.translate(t) 让每个字符走过位移后的字母表。

辅助函数 encryptdecrypt 只是薄薄的包装,用来设置相应的标志。

参考文献

Back to Blog

相关文章

阅读更多 »

当 AI 给你一巴掌

当 AI 给你当头一棒:在 Adama 中调试 Claude 生成的代码。你是否曾让 AI “vibe‑code” 一个复杂功能,却花了数小时调试细微的 bug……