公开密钥加密(公钥加密)就是 7.3 埋的那个"解药":每个人都有一对数学上配对的钥匙——公钥像挂在门口的挂锁(谁都能拿去锁),私钥是自己兜里的钥匙(只有自己能开)。发信人用收信人的公钥上锁,全世界只有持有对应私钥的人能打开。它一举解决了共享密钥加密的两大难题:钥匙不用再提前秘密分发(公钥本来就要广而告之),数量爆炸也消失(n 个人只需要 n 对钥匙,而不是 n(n-1)/2 把)。代价是慢——所以现实中它只干"送会话密钥"的小活,大数据量的活还是交给 AES(混合加密)。代表算法是 RSA,安全性建立在"两个大素数相乘容易、把乘积分解回去极难"这个数学事实上。
7.2 把加密分成两条路线(对称 vs 公开),7.3 把左半边(共享密钥)放大细看完,本节轮到右半边登台。7.3 留下的两大难题——首次分发和数量爆炸——本节全部给出现成的解法。
老账继续对上:7.2 埋的"公钥加密私钥解"和混合加密在这里正式展开;7.1 讲的数字证书(CA 给公钥盖信任章)用的就是本节的钥匙对;5.21 的 WPA2 虽然走的是共享密钥路线,但它背后"密码不上线"的思想和本节"公钥随便发"是同一个安全感来源——真正需要保密的从来不是算法,而是那一把不能公开的钥匙。另外本节还埋一个新钩子:私钥反过来用(私钥加密、公钥验证),就是下一节的数字签名。
一、工作原理:一对钥匙,一开一锁(第一张配图)
共享密钥加密只有一把钥匙:加密用它,解密也用它,所以必须提前安全地交到对方手里。
公开密钥加密有两把钥匙,它们成对生成:
- 公钥(public key):可以随便发——贴公告栏、放网页上、塞进证书里,谁拿到都行;
- 私钥(private key):绝不外传,只有本人持有。
发信流程三步:
- 小波要给老墨发密文,先拿到老墨的公钥(公开的,随时可取);
- 用这把公钥把明文上锁,得到密文,密文随便走公开网络;
- 老墨收到后,用自己的私钥开锁——全世界只有他有这把钥匙。
关键性质:公钥锁上的东西,连锁它的人自己都打不开。窃听者就算把公钥、密文全部截获,也只能干瞪眼——因为开锁的钥匙从头到尾没在网络上出现过。
这就是"挂锁"比喻:你可以把自己的挂锁(公钥)复制一万份随便送人,别人锁好箱子寄回来,能打开箱子的只有你兜里那把钥匙(私钥)。
二、为什么安全:RSA 与大数质因数分解
公开密钥加密的代表算法是 RSA(1977 年,三位发明者 Rivest、Shamir、Adleman 姓氏首字母)。
它的安全根基是一道不对称的数学题:
- 正着算容易:随便挑两个大素数,相乘得到乘积——一眨眼的事;
- 反着算极难:只给你那个几百位的乘积,让你找出它是哪两个素数乘出来的——以现有算力,宇宙热寂之前也算不完。
公钥和私钥就是从这对素数数学上推导出来的:由素数(私钥材料)算出公钥很容易,由公钥反推私钥等价于做那道"分解大数"难题。
这和 7.3 的"密钥空间"思想一脉相承:安全性不靠算法保密,靠钥匙的数学难度。RSA 的钥匙长度按位数计(2048 位、4096 位),越长越难破——穷举成本同样随长度指数上涨。
三、改写数量账:n 对钥匙取代 n(n-1)/2(第二张配图)
把 7.3 的两笔旧账摆出来对一对:
| 难题 | 共享密钥加密 | 公开密钥加密 |
|---|---|---|
| 首次分发 | 第一把钥匙必须走秘密渠道(先有鸡还是先有蛋) | 公钥本来就要公开,走公开渠道正合适 |
| 数量爆炸 | n 人两两通话要 n(n-1)/2 把(1000 人 = 499500 把) | 每人 1 对 × n 人 = n 对(1000 人 = 1000 对) |
钥匙数量从平方级降到线性级,而且分发从"最难的环节"变成"最不需要操心的环节"——这就是教材说它"使用两个密钥管理数据"的含义:钥匙从一个变成一对,问题从两个变成零个。
四、公钥"随便发"就不怕被人掉包吗?
公钥不用保密,但有个新问题:你拿到的公钥,真是对方的吗?
窃听者可以玩"调包计":在中间把自己伪造的公钥发给你,你锁的箱子他能用自己的私钥打开——这就是"公钥真实性"问题。
解法 7.1 已经剧透过:数字证书——由大家公认的认证机构(CA)用自己的私钥给"这把公钥属于老墨"这句话盖信任章。浏览器地址栏那把小锁背后,就是这条信任链在运转。
一句话:公钥解决了"钥匙怎么送",证书解决了"钥匙认不认"——两块拼图合上,密钥分发难题才算真正闭环。
五、公开密钥的岗位职责:干小活,不干重活
公钥加密有个绕不开的短板:慢——比 AES 慢成百上千倍(数学运算重,密钥又长)。
所以现实中它不扛大数据量加密,而是守住几个关键岗位:
- 送会话密钥:HTTPS 握手时,用服务器公钥把一把随机的 AES 会话密钥安全送过去,之后的大流量全部走 AES——这就是 7.2 说的混合加密的全部含义;
- 数字证书:CA 体系的基础设施(本节的钥匙对 + 下一节的签名);
- 数字签名:私钥反过来用的产物,下一节的主角。
分工口诀:公开密钥干"见面递钥匙"的小活,共享密钥干"长途运货"的大活。
六、动手 Demo(Demo92)
亲手做一次"公钥上锁、私钥开锁"——不用装任何东西,Windows 自带的 PowerShell 就能跑。
第一步:生成一对钥匙 + 加密 + 解密(一次跑完)
按 Win 键 → 输入 powershell → 回车打开蓝色窗口,整段粘贴后回车:
$rsa = [System.Security.Cryptography.RSACryptoServiceProvider]::new(2048)
$publicXml = $rsa.ToXmlString($false) # 公钥(false = 不含私钥)
$privateXml = $rsa.ToXmlString($true) # 私钥(true = 含私钥)
$plain = [Text.Encoding]::UTF8.GetBytes("bonjour, 这是只有老墨能看的信")
$enc = $rsa.Encrypt($plain, $false)
"密文(Base64,前 40 字符): " + [Convert]::ToBase64String($enc).Substring(0,40) + "..."
$rsa2 = [System.Security.Cryptography.RSACryptoServiceProvider]::new()
$rsa2.FromXmlString($privateXml) # 换成一把"没有私钥"的空钥匙
"用私钥解密: " + [Text.Encoding]::UTF8.GetString($rsa2.Decrypt($enc, $false))
看什么算成功:最后一行打印出 用私钥解密: bonjour, 这是只有老墨能看的信——锁上了,又用另一把钥匙原样打开了。
第二步:验证"没有私钥就打不开"
把倒数第二行的 $privateXml 换成 $publicXml 再跑一遍。
看什么说明不对(其实是对了):会报错——因为用公钥去开公钥锁上的箱子,数学上就开不了。这个"报错"恰恰是本节主旨的现场证明:公钥能锁,只有配对的私钥能开。
第三步:看看自己的浏览器里有多少把"公钥"
随便打开一个 https 网站 → 地址栏锁图标 → 「连接安全」→「证书有效」→ 详细信息里能看到网站的公钥正敞着摆在全世界面前——而服务器手里的私钥从没上线,却依然没人能偷看你们的通信。
30 秒实验:把 Demo92 里的 2048 改成 512 再生成钥匙,体会一下"钥匙越长越难破"——512 位的 RSA 在现代电脑上几分钟就能分解(所以标准要求最低 2048 位起步)。
七、常见误区
- "公钥加密 = 更安全,那就全用它":恰恰相反,它又慢又只能加密很短的数据(RSA 一次 encrypt 的明文长度受钥匙长度限制),所以从来不用它直接加密大文件——大数据量的活永远是 AES 的。
- "公钥是公开的,所以泄密也无所谓":公钥泄露确实不影响保密性,但被掉包就完蛋了——所以才有数字证书这层"公钥的公证人"。
- "公钥和私钥谁加密都一样吧":方向不同,用途完全不同。公钥加密 → 私钥解 = 保密(本节);私钥加密 → 公钥验证 = 签名(下一节)。搞混方向,安全模型就整个塌了。
- "RSA 钥匙 2048 位,AES 才 128 位,所以 RSA 更强":两套体系的"位"不是一个量法,不能直接比大小。AES-128 的安全强度大致对应 RSA 3072 位左右。
- "公开密钥加密淘汰了共享密钥加密":没有淘汰,是分工。全世界真正加密数据的 99% 仍然是 AES(共享密钥),公开密钥只负责把 AES 的钥匙安全送到位。
八、动手自测
点开自测(先自己答,再展开对答案)
1. 公开密钥加密里,哪把钥匙用来加密?哪把用来解密? 2. 为什么公钥随便公开也不影响保密性? 3. 1000 人的公司:共享密钥要多少把钥匙?公开密钥要多少对? 4. RSA 的安全性建立在哪道"不对称数学题"上? 5. 公钥加密又慢又挑食(只能加密短数据),那 HTTPS 里它到底干什么活? 6. 本节埋的"私钥反过来用"是什么技术?它解决的是保密还是抵赖?答案
1. 用**收信人的公钥**加密,收信人用自己的**私钥**解密。 2. 因为加密用的是公钥,解密必须用配对的私钥——私钥从不上网络,公钥就算人人都有,也只能"锁"不能"开"。 3. 共享密钥:1000 × 999 ÷ 2 = **499500** 把;公开密钥:**1000 对**(每人自己保管 1 对,公钥随便发)。 4. 两个大素数**相乘容易、把乘积分解回两个素数极难**——由公钥反推私钥等价于解这道题。 5. 只干**送会话密钥**的小活:握手时用服务器公钥把一把随机的 AES 密钥安全送过去,之后的全部数据流量都走 AES(混合加密)。 6. **数字签名**:私钥"加密"、公钥验证。它不解决保密,解决的是**防抵赖**和**防篡改**——下一节的主角。九、下一步学什么
- ☑ 7.5(按教材顺序)
相关笔记
- 通过密钥加密的数据确认加密者身份(私钥、RSA加密、椭圆曲线加密) —— 本节埋的"私钥反过来用"登场:私钥造公钥验,保密方向升级出认证方向
- 使用一个密钥管理数据(共享密钥加密方式) —— 本节就是它埋下的"解药":首次分发与数量爆炸两大难题在此收账
- 防止数据被窃听的方法(加密) —— 两条路线的并排总览;混合加密(公钥送钥匙 + AES 干活)在本节正式归队
- 限制访问用户和设备的方法(身份认证) —— 数字证书(CA 给公钥盖信任章)解决"公钥是不是真身"
- 无线局域网的安全性(WPA2) —— "真正保密的是钥匙不是算法"思想的第一现场
- 浏览Web网站时执行的处理(DNS的域名解析、HTTP请求与HTTP响应) —— HTTPS = 给这条明文流水线套上"混合加密",本节是它的一半引擎