🌐 第七章 网络安全技术
📄 一句话概括

公开密钥加密(公钥加密)就是 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 虽然走的是共享密钥路线,但它背后"密码不上线"的思想和本节"公钥随便发"是同一个安全感来源——真正需要保密的从来不是算法,而是那一把不能公开的钥匙。另外本节还埋一个新钩子:私钥反过来用(私钥加密、公钥验证),就是下一节的数字签名。

一、工作原理:一对钥匙,一开一锁(第一张配图)

共享密钥加密只有一把钥匙:加密用它,解密也用它,所以必须提前安全地交到对方手里。

公开密钥加密有两把钥匙,它们成对生成:

发信流程三步:

  1. 小波要给老墨发密文,先拿到老墨的公钥(公开的,随时可取);
  2. 用这把公钥把明文上锁,得到密文,密文随便走公开网络;
  3. 老墨收到后,用自己的私钥开锁——全世界只有他有这把钥匙。

关键性质:公钥锁上的东西,连锁它的人自己都打不开。窃听者就算把公钥、密文全部截获,也只能干瞪眼——因为开锁的钥匙从头到尾没在网络上出现过。

这就是"挂锁"比喻:你可以把自己的挂锁(公钥)复制一万份随便送人,别人锁好箱子寄回来,能打开箱子的只有你兜里那把钥匙(私钥)。

二、为什么安全: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 慢成百上千倍(数学运算重,密钥又长)。

所以现实中它不扛大数据量加密,而是守住几个关键岗位:

分工口诀:公开密钥干"见面递钥匙"的小活,共享密钥干"长途运货"的大活。

六、动手 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 位起步)。

七、常见误区

八、动手自测

点开自测(先自己答,再展开对答案) 1. 公开密钥加密里,哪把钥匙用来加密?哪把用来解密? 2. 为什么公钥随便公开也不影响保密性? 3. 1000 人的公司:共享密钥要多少把钥匙?公开密钥要多少对? 4. RSA 的安全性建立在哪道"不对称数学题"上? 5. 公钥加密又慢又挑食(只能加密短数据),那 HTTPS 里它到底干什么活? 6. 本节埋的"私钥反过来用"是什么技术?它解决的是保密还是抵赖?
答案 1. 用**收信人的公钥**加密,收信人用自己的**私钥**解密。 2. 因为加密用的是公钥,解密必须用配对的私钥——私钥从不上网络,公钥就算人人都有,也只能"锁"不能"开"。 3. 共享密钥:1000 × 999 ÷ 2 = **499500** 把;公开密钥:**1000 对**(每人自己保管 1 对,公钥随便发)。 4. 两个大素数**相乘容易、把乘积分解回两个素数极难**——由公钥反推私钥等价于解这道题。 5. 只干**送会话密钥**的小活:握手时用服务器公钥把一把随机的 AES 密钥安全送过去,之后的全部数据流量都走 AES(混合加密)。 6. **数字签名**:私钥"加密"、公钥验证。它不解决保密,解决的是**防抵赖**和**防篡改**——下一节的主角。

九、下一步学什么

相关笔记