公钥密码(RSA, ECC)
公钥密码用一对密钥——公钥加密、私钥解密,解决了对称加密的密钥分发问题。RSA 基于大整数分解,ECC 基于椭圆曲线离散对数
🚪 “寄个箱子给我,我把信放进去”——密钥分发的革命
对称加密有一个死穴:你怎么把密钥安全地告诉对方?
古时候的做法:派遣最信任的信使,把密钥藏在衣服里送过去。但如果信使被截——整个通信系统就完了。
1976 年,Diffie 和 Hellman 提出了一个革命性的想法:不用共享密钥也能安全通信。
你:在网站上公开你的"公钥"
我:用你的公钥加密消息——只有你能解密
你:用你的"私钥"解密——别人解不了,因为只有你知道私钥
这就是公钥密码(Public-Key Cryptography)——也叫非对称加密(Asymmetric Encryption)。
📐 核心思想:
- 公钥(Public Key):公开给全世界——用来加密
- 私钥(Private Key):只有自己知道——用来解密
- 用公钥加密的消息,只能用对应的私钥解密
🏪 **类比:信箱”
你在教室门口挂了一个信箱(公钥)。任何人都可以把纸条投进去(加密)。但只有你有钥匙打开信箱(私钥解密)。
不需要你和”任何人”事先约定密钥——你只需要公开”信箱”的位置。
🔢 RSA——最经典的公钥密码
RSA 由 Rivest、Shamir、Adleman 三人于 1977 年提出,名字就是他们姓氏的首字母。
数学原理
RSA 的安全性基于一个”简单但难”的数学问题:大整数的质因数分解。
两个大质数相乘 → 很容易
从乘积反推出两个质数 → 极难
比如:
p = 61, q = 53 → n = 61×53 = 3233 → 简单
从 3233 反推出 61 和 53 → 还简单
从 2^2048 位的数反推出两个质数 → 几百台计算机算几百年
密钥生成
# RSA 密钥生成(简化版)
# 1. 选两个大质数 p 和 q
p = 61
q = 53
# 2. 计算 n = p × q
n = 61 * 53 # 3233
# 3. 计算 φ(n) = (p-1)(q-1)
phi = 60 * 52 # 3120
# 4. 选 e(通常用 65537),求 d 使 e×d ≡ 1 (mod φ(n))
e = 17
d = pow(e, -1, phi) # 2753
# 公钥:(n, e) = (3233, 17)
# 私钥:(n, d) = (3233, 2753)
# 加密:c = m^e mod n
def encrypt(m, n, e):
return pow(m, e, n)
# 解密:m = c^d mod n
def decrypt(c, n, d):
return pow(c, d, n)
# 测试
m = 42 # 明文
c = encrypt(m, n, e) # 加密
m2 = decrypt(c, n, d) # 解密
print(m2) # 42
RSA 的代价——速度
RSA 比 AES 慢几千倍。所以实际中从不直接用 RSA 加密大量数据——而是:
1. 生成一个随机的对称密钥(比如 AES 密钥)
2. 用 RSA 公钥加密这个对称密钥
3. 用 AES 加密实际数据
4. 把加密的密钥 + 加密的数据一起发送
接收方:
1. 用 RSA 私钥解密得到对称密钥
2. 用对称密钥解密数据
这就是混合加密(Hybrid Encryption)——SSL/TLS 的底层机制。
🌀 ECC——更高效率的公钥密码
ECC(Elliptic Curve Cryptography,椭圆曲线密码) 用更短的密钥达到和 RSA 相同的安全等级。
安全性 80 位:RSA 1024 位 vs ECC 160 位
安全性 128 位:RSA 3072 位 vs ECC 256 位 ← 目前推荐
安全性 256 位:RSA 15360 位 vs ECC 512 位
手机上每次 HTTPS 连接都要做公钥运算——ECC 的短密钥意味着更快的握手、更低的功耗。这也是为什么现代 TLS 普遍使用 ECC(ECDHE 密钥交换)。
💡 ECC 的数学基础:椭圆曲线上的”点加法”运算。给定一个点 G,计算 G+G+G+…(k 次)很容易;但给定 G 和结果 kG,反推 k 很难。这就是”椭圆曲线离散对数问题”。
🔑 密钥管理——公钥体系的阿克琉斯之踵
“公钥是公开的”——但你怎么确定你拿到的”张三的公钥”真的是张三的?
攻击者冒充张三:
1. 你想给张三发消息,向张三要公钥
2. 攻击者拦截请求,把自己的公钥发给你
3. 你用攻击者的公钥加密消息——攻击者能解密!
这就是中间人攻击(MITM)。解决方案——数字证书,由 CA(证书机构)来”证明”某个公钥确实属于某个人。
📝 小结
| 概念 | 一句话 |
|---|---|
| 公钥密码 | 公钥加密 + 私钥解密——解决了密钥分发问题 |
| RSA | 基于大整数分解——最经典但密钥长、速度慢 |
| ECC | 基于椭圆曲线——同安全等级下密钥更短、更快 |
| 混合加密 | RSA/AES 混合——用 RSA 交换对称密钥,用 AES 加密数据 |
| 密钥空间对比 | 256 位 ECC ≈ 3072 位 RSA |
| MITM(中间人攻击) | 如果公钥被篡改——再强的加密也没用 |
🎯 思考题:为什么 RSA 不能直接加密大量数据?除了速度慢之外,还有一个”长度限制”——RSA 能加密的明文必须小于 n 的字节数(密钥长度)。如果用 2048 位的密钥,一次最多能加密多少字节的明文?
为什么先学这个? 公钥密码解决了密钥分发问题。但它有一个新的问题——你怎么知道你手里的公钥是真的?这就是下一个话题——哈希函数和数字签名。