📄 一句话概括
凯撒密码把每个字符的编码统一错开几位:错开是加密、错回是解密——计算机里字符本来就是数字,错起来顺手极了。
📝 本节和前面几节的关系
三要素认识了,本节看最古老的加密算法——两千年前的凯撒大帝用过的【错开编码】。
一、凯撒密码的做法
字母表 A~Z 排成一圈,每个字母沿固定位数挪一个位置:错开 3 位,A 变 D、B 变 E; HELLO 错开 3 位就成了 KHOOR——明文里看不出原文的影子; 解密就是反向操作:把每个字母往回挪 3 位,KHOOR 回到 HELLO。
二、为什么计算机做这个特别顺手
计算机里字符本来就是编号(ASCII/Unicode)——【错开】就是编号加减法; 一圈循环用取余实现:编码加 3 后对 26 取余,Z 再往后就绕回 A; 中文同样适用:UTF-8 下汉字也是一串数字,数字都能错开——思路通用,只是实际不用它加密中文。
三、密钥就是【错开几位】
这套方法里密钥小得可怜:错开的位数本身——0 到 25 只有 26 种可能; 方法公开、密钥极短,破译者拿到密文把 26 种全试一遍就破防; 下一节就顺着这个破绽,看【密钥空间】怎么决定安全程度。
四、动手 Demo:亲手错开一次字符编码
把 HELLO 逐字符错开 3 位加密,再错回来解密,看清每个编号的来龙去脉。
plain = "HELLO"
k = 3
enc = "".join(chr((ord(c) - ord("A") + k) % 26 + ord("A")) for c in plain)
print("密文:", enc)
dec = "".join(chr((ord(c) - ord("A") - k) % 26 + ord("A")) for c in enc)
print("解出:", dec)
实跑输出:
--------------------------------------------------------------------
错开字符编码的加密方式
--------------------------------------------------------------------
最古老的加密: 把每个字符的编码统一错开几位——叫【凯撒密码】, 凯撒大帝用过。
错开 3 位, 逐个字符加密 HELLO:
H (编号 72) -> K (编号 75)
E (编号 69) -> H (编号 72)
L (编号 76) -> O (编号 79)
L (编号 76) -> O (编号 79)
O (编号 79) -> R (编号 82)
密文: KHOOR
解密就是把编号往回错 k 位:
KHOOR -> HELLO <- 回到明文
计算机里字符本来就是数字(1.4 节【对计算机来说什么都是数字】),
所以【错开编码】这种加密对计算机来说顺手极了。
中文没有字母表, UTF-8 下同样是一串数字——数字都能错开, 思路通用。
enc 是 KHOOR——H(7)→K(10)、E(4)→H(7),每个编号都恰好前进了 3。 取余 % 26 负责绕圈:X 错开 3 位会绕过 Z 回到 A,这就是【排成一圈】的写法。
30 秒实验
- 手工把 NETWORK 错开 3 位写出密文,再自己错回去验证。
- 用 Python 把错开位数改成 13 再加密 HELLO,观察加密两次会发生什么(ROT13 的彩蛋)。
常见误区
- 以为凯撒密码只能加密英文——原理是错开编码,对任何数字编码都成立。
- 以为错开位数越多越安全——位数再多也只有 25 种实质选择,暴力全试毫无压力。
自测三问(点开对答案)
1. 凯撒密码的加密动作是什么? —— 把每个字符的编码沿字母表错开固定位数。 2. 它的密钥是什么? —— 错开的位数——密钥空间只有 26。 3. 解密怎么做? —— 反向错回同样的位数(等价于错开 26 减密钥位)。- ☐ 下一节(10.3 密钥越长,解密越困难)
相关笔记
- 先来明确一下什么是加密 — 三要素在本节落地成实例
- 高速的加密方式 — 凯撒这类【同一把钥匙加解密】的体系在那边
- 💻 计算机是怎样跑起来的 · 索引