加密的全部任务,是让一段信息只有持有正确「钥匙」的人才能读懂。 下面这台机器正在实时运转——改动文字或拨动转盘,看明文如何被搅乱成密文。
几乎所有你听过的算法都能归进这三类。先建立这张地图,后面每个算法都能立刻对号入座。
加密和解密用同一把密钥。速度快,适合加密大量数据。难点在于:怎么安全地把这把钥匙交给对方?
每人有公钥 + 私钥一对。公钥随便发,谁都能用它加密;只有对应私钥能解开。慢,但解决了「钥匙怎么送」的难题。
把任意数据压成固定长度的指纹。无法逆推回原文——它不是加密,而是用来验证完整性和存口令。
易混点:哈希不是加密,因为它不可逆、也没打算让你解回去;Base64 更不是加密,那只是一种编码,任何人都能直接还原。本页把哈希一并讲,是因为它在密码学里几乎无处不在。
从最古老的密码开始,因为它们的「机制看得见」。凯撒密码把每个字母在字母表里向后挪固定的几位——位移量就是密钥。它的死穴是:只有 25 种可能,挨个试一遍就破了(暴力破解),而且不改变字母频率,英文里最常见的 e 加密后仍然最常见,统计一下就露馅。
维吉尼亚密码是凯撒的升级:不再用一个固定位移,而是用一个密钥词循环套在明文上,每个字母按密钥对应字母的位置移动。这样同一个明文字母在不同位置会变成不同密文,频率分析失效了好几百年——直到有人发现密钥长度可以被推断出来。
这两种都是教学玩具,今天没有任何场景该用它们保护真实数据。它们的价值在于让你直观理解「位移」「密钥」「频率分析」这些概念。
高级加密标准(Advanced Encryption Standard)是今天对称加密的事实标准,HTTPS、磁盘加密、微信消息几乎都在用它。它把数据切成 128 位的块,在一个 4×4 字节矩阵上反复做字节替换、行移位、列混淆、轮密钥加四步,重复 10/12/14 轮(对应 128/192/256 位密钥)。每一轮都让数据更彻底地「扩散和混淆」,最终任何人没有密钥都无从下手。
下面这台是真加密——调用浏览器原生的 Web Crypto,用 AES-GCM 模式。你的口令会经 PBKDF2 派生成 256 位密钥,每次加密还会生成随机 IV,所以同样的明文每次密文都不同(这是好事)。
RSA 的安全建立在一个朴素事实上:两个大素数相乘很容易,但把乘积分解回去极难。它造出一对钥匙——公钥 (n, e) 公开给所有人加密,私钥 (n, d) 自己留着解密。下面用很小的素数把整个数学骨架拆给你看(真实 RSA 的 n 有 600 多位数字,这里只是为了看清原理)。
上面的演示省略了填充(padding)、随机化、防侧信道等一切真实工程要素。自实现的密码学几乎必然存在可被利用的漏洞。原则:理解原理,但永远调用经过审计的成熟库(如 libsodium、浏览器 Web Crypto、OpenSSL)。
哈希函数把任意长度的输入压成一个固定长度的指纹(SHA-256 永远输出 256 位 / 64 个十六进制字符)。它有几个关键性质:同样输入永远得同样输出、无法从指纹反推原文、极难找到两个不同输入产生相同指纹。下面也是真实计算(Web Crypto)。
最迷人的性质是雪崩效应:输入哪怕只改一个字,输出会有大约一半的二进制位翻转,且毫无规律。改下面任一框里的文字,看看两个指纹的差异有多剧烈。
应用:网站不该存你的明文密码,而是存密码的哈希(还要加盐 + 慢哈希如 bcrypt/Argon2)。下载文件后比对 SHA-256,能确认它没被篡改或损坏。
对称加密又快又好,但「怎么把那把共享钥匙安全送给对方」是个死结——网络上全是窃听者。DH 密钥交换巧妙地解决了它:双方在公开信道上喊话,却能各自算出一个只有他俩知道的共享密钥,窃听者全程听着也算不出来。
经典的颜色比喻:双方公开一种共享底色,各自偷偷加一种私密色混合后交换,再把对方的混合色和自己的私密色再混一次——两人最终得到同一种颜色,而旁观者拿到两份混合色也调不出它,因为「把颜色分离回去」做不到。
真实 DH 用大素数下的模幂运算(离散对数难题)替代「混颜色」。算出共享密钥后,双方再用它做 AES 这种快速对称加密——这正是 HTTPS 握手每天在做的事。
| 算法 | 类别 | 钥匙 | 可逆 | 典型用途 |
|---|---|---|---|---|
| Caesar / Vigenère | 对称(古典) | 位移 / 密钥词 | 是 | 仅教学 |
| AES | 对称 | 1 把共享 | 是 | 数据 / 通信内容 |
| ChaCha20 | 对称 | 1 把共享 | 是 | 移动端 / 流加密 |
| RSA | 非对称 | 公钥 + 私钥 | 是 | 密钥传输 / 签名 |
| ECC (椭圆曲线) | 非对称 | 公钥 + 私钥 | 是 | 同 RSA,更短更快 |
| Diffie-Hellman | 非对称 | 公钥 + 私钥 | — | 协商共享密钥 |
| SHA-256 / SHA-3 | 哈希 | 无 | 否 | 校验 / 签名摘要 |
| bcrypt / Argon2 | 哈希(慢) | 无(加盐) | 否 | 密码存储 |
| MD5 | 哈希(已破) | 无 | 否 | 仅校验,勿用于安全 |
① 别自己造加密算法,调用成熟库。② 哈希存密码必须加盐 + 用慢哈希。③ 现实里几乎都是组合拳:非对称协商密钥 → 对称加密内容 → 哈希做完整性校验,HTTPS 就是这个套路。