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

7.4 的公开密钥加密有个暗门:任何人都能拿到你的公钥给你写信——保密做到了,身份却是空的。本节把钥匙对反过来用:用自己的私钥加密数据发出去,收信人拿你的公钥解——能解开,就证明这数据全世界只有你那把私钥造得出来,"能被公钥解开"本身就是发信人身份证。这就是数字签名(下一节盖楼)的地基。教材标题里的两个算法都是干这活的:RSA(大数质因数分解,钥匙 2048/4096 位,资格最老)和椭圆曲线加密 ECC(椭圆曲线离散对数难题,钥匙 256 位就有 RSA-3072 的强度,短一大截——所以手机和物联网都爱它)。Demo90 在浏览器里见过的 ECDHE,就是 ECC 版的密钥交换。

📝 本节和前面几节的关系

7.2~7.4 一直在解决"别人看不懂"(机密性),本节第一次转向"确认真的是你"(认证性)——正好接上 7.1 认证三要素里的"你持有私钥"这条线。7.4 埋的那句"私钥反过来用"在本节正式展开。

老账继续对上:7.2 说"加密防不了篡改、也防不了冒充",本节的私钥加密方向就是补这个窟窿的第一块砖;7.1 的数字证书里,CA 给公钥"盖信任章"用的正是本节的私钥加密能力;Demo90 浏览器密码套件里的 ECDHE 在这里揭晓真身——椭圆曲线版的密钥交换,每次打开 https 网页它都在跑。

一、7.4 的暗门:保密做到了,身份却是空的

用公开密钥加密发信,流程是"拿收信人的公钥上锁"。问题在于:公钥是随便谁都能拿到的。

于是出现一个尴尬局面:小波收到一封"老墨"发来的加密信,解得开、看得懂——但这信真是老墨发的吗?任何第三者都能拿到老墨的公钥,锁一封信冒充老墨。保密性满分,身份认证零分。

这和 7.1 的认证思想接上了:光证明"数据没人偷看"不够,还得证明"这数据出自谁的手"。

二、反过来用钥匙:私钥加密 = 亮出身份证(第一张配图)

钥匙对有两种用法,方向完全相反:

验证逻辑一句话:用"老墨的公钥"能解开的数据,全世界只有"老墨的私钥"能造出来。公钥人人都有,谁都可以当"验票员";但票(密文)只有持私钥的人造得出。伪造者没有那把私钥,数学上就锁不出能被这把公钥打开的东西。

这和 5.21"密码不上线"是同一种安全感:真正需要保密的(私钥)从头到尾没在网络上出现过,可身份照样验成了。

三、RSA 的两个方向:一对钥匙、两套安全模型

RSA 本身是对称的数学构造——两个方向都通,但用途必须分清:

方向① 公钥加密 → 私钥解 方向② 私钥加密 → 公钥解
求什么 保密(只有我能看) 认证(确实是我发的)
谁能加密 任何人(公钥公开) 只有私钥主人
谁能解密 只有私钥主人 任何人(公钥公开)
对应岗位 送会话密钥 数字签名、证书盖章

铁律:方向不能混。用"公钥加密"去验身份是荒谬的(人人能加密),用"私钥加密"去保密更是笑话(人人能解密)。方向选错,安全模型整个塌掉。

顺带一提:现实中"私钥加密"不是把整封信加密(太慢、也太浪费),而是只对数据的"指纹"(哈希值,下一节细讲)做私钥运算——这就是数字签名的标准形态。本节先把方向和原理吃透。

四、椭圆曲线加密(ECC):更短的钥匙、同样的强度

公开密钥家族不止 RSA 一个成员。教材点名的另一位主力是椭圆曲线加密(ECC,1985 年提出)。

对照表:RSA 资格最老、生态最广(证书、老系统);ECC 更新更轻(新系统、移动端)。两者干的都是本节和 7.4 的活——只是数学地基不同。

五、现实岗位:这些"身份确认"每天都在发生

六、动手 Demo(Demo93)

亲手做一次"私钥盖章、公钥验章、篡改现形"。还是不用装任何东西,PowerShell 直接跑。

第一步:盖章 + 验真章

按 Win 键 → 输入 powershell → 回车,整段粘贴后回车:

$rsa = [System.Security.Cryptography.RSACryptoServiceProvider]::new(2048)
$publicXml = $rsa.ToXmlString($false)          # 公钥(给验票员的)
$data = [Text.Encoding]::UTF8.GetBytes("这是老墨亲自发的消息")
$sig = $rsa.SignData($data, [Security.Cryptography.HashAlgorithmName]::SHA256, [Security.Cryptography.RSASignaturePadding]::Pkcs1)
$ver = [System.Security.Cryptography.RSACryptoServiceProvider]::new()
$ver.FromXmlString($publicXml)                 # 验证方手里只有公钥
"验证真章: " + $ver.VerifyData($data, [Security.Cryptography.HashAlgorithmName]::SHA256, $sig)

看什么算成功:最后一行打印 验证真章: True——验证方手里只有公钥,却确认了"这消息确实出自那把私钥的主人"。

第二步:篡改一个字,看现形

接着粘贴(消息里把"亲"改成"假"):

$data2 = [Text.Encoding]::UTF8.GetBytes("这是老墨假自发的消息")
"验证篡改后: " + $ver.VerifyData($data2, [Security.Cryptography.HashAlgorithmName]::SHA256, $sig)

看什么算成功:打印 验证篡改后: False——内容动了一个字,验章立刻失败。7.2 说"加密防不了篡改",这里第一次看到"防篡改"的钥匙被找到了。

第三步:看一眼自己手机上的 ECC

打开 https 网站 → 地址栏锁图标 → 证书详细信息,留意"公钥算法"一栏:很多网站已经写着 ECDSA(椭圆曲线签名)——你正在围观本节两位主角同台。

30 秒实验:把 Demo93 的 2048 改成 512,照样能签能验——但 512 位的 RSA 私钥现在几分钟就能被破解,"能验章"不等于"章可信",钥匙强度是身份确认的地基(呼应 7.3 的密钥空间)。

七、常见误区

八、动手自测

点开自测(先自己答,再展开对答案) 1. 7.4 的公开密钥加密有个什么暗门?本节怎么补上? 2. 私钥加密的数据,谁能造出来?谁能解开?分别说明这件事的什么性质? 3. "公钥加密 → 私钥解"和"私钥加密 → 公钥解"分别求什么?方向搞反会怎样? 4. ECC 的钥匙为什么可以比 RSA 短那么多?ECC-256 大约对应 RSA 多少位? 5. Demo90 见过的 ECDHE 是什么?它出现在 https 握手的哪个环节? 6. 验章通过了,还有什么可能被骗?靠什么兜底?
答案 1. 暗门:公钥人人能拿,**任何人都能冒充你写信**(保密≠认证)。补法:把钥匙反过来——用**自己的私钥**加密发信,收信人用你的公钥验。 2. 全世界**只有私钥的主人**能造出来(认证性);**任何持有公钥的人**都能解开(公开性)——所以"能被这把公钥解开"就成了"确实出自私钥主人之手"的身份证。 3. 前者求**保密**,后者求**认证**。搞反了:用公钥加密验身份是荒谬的(人人能加密),用私钥加密求保密是笑话(人人能解密)——安全模型整个塌掉。 4. 因为 ECC 靠的是**椭圆曲线离散对数难题**,这道题比大数分解"更抗算"——同样强度下钥匙可以短得多。ECC-256 ≈ **RSA-3072**。 5. **椭圆曲线 Diffie-Hellman 密钥交换**——ECC 版的密钥协商。出现在 https 握手阶段:浏览器和服务器现场商量出一把 AES 会话密钥,之后的流量全走 AES。 6. 验章只证明密文出自对应私钥;如果**那把公钥本身是假的**(被人掉包),验得再对也是被骗。靠**数字证书**(CA 背书公钥的真实性)兜底。

九、下一步学什么

相关笔记