公钥密码基础(一):从对称密码到公钥密码------密钥分发问题
-
- 前言
- 一、对称密码的前提:双方必须共享同一把密钥
-
- [1.1 对称加密的基本模型](#1.1 对称加密的基本模型)
- [1.2 为什么不能直接把密钥发过去](#1.2 为什么不能直接把密钥发过去)
- [1.3 密钥必须保密,还必须确认属于谁](#1.3 密钥必须保密,还必须确认属于谁)
- 二、用户数量增加后,密钥数量为什么会失控
-
- [2.1 两个用户只需要一把共享密钥](#2.1 两个用户只需要一把共享密钥)
- [2.2 n n n 个用户需要多少把密钥](#2.2 n n n 个用户需要多少把密钥)
- [2.3 每个用户需要保存多少密钥](#2.3 每个用户需要保存多少密钥)
- [2.4 群组共享一把密钥也不是理想修复](#2.4 群组共享一把密钥也不是理想修复)
- 三、公钥密码出现之前,密钥是怎样分发的
-
- [3.1 线下或带外分发](#3.1 线下或带外分发)
- [3.2 密钥分发中心 KDC](#3.2 密钥分发中心 KDC)
- [3.3 中心化方案的新问题](#3.3 中心化方案的新问题)
- 四、公钥密码的关键突破:公开加密密钥
-
- [4.1 一对密钥承担不同职责](#4.1 一对密钥承担不同职责)
- [4.2 公钥为什么可以公开](#4.2 公钥为什么可以公开)
- [4.3 密钥数量从平方级降到线性级](#4.3 密钥数量从平方级降到线性级)
- 五、一个完整的公钥加密通信过程
-
- [5.1 Bob 生成密钥对](#5.1 Bob 生成密钥对)
- [5.2 Alice 使用 Bob 的公钥加密](#5.2 Alice 使用 Bob 的公钥加密)
- [5.3 Bob 使用私钥解密](#5.3 Bob 使用私钥解密)
- [5.4 这个流程还缺少身份认证](#5.4 这个流程还缺少身份认证)
- 六、中间人攻击:公钥密码没有自动解决信任
-
- [6.1 攻击过程](#6.1 攻击过程)
- [6.2 公钥需要认证](#6.2 公钥需要认证)
- [6.3 证书也不是凭空可信](#6.3 证书也不是凭空可信)
- 七、真实系统为什么仍然使用对称密码
-
- [7.1 公钥密码并不适合直接加密大量数据](#7.1 公钥密码并不适合直接加密大量数据)
- [7.2 混合加密的基本模型](#7.2 混合加密的基本模型)
- [7.3 两类密码不是替代关系](#7.3 两类密码不是替代关系)
- [八、密钥交换、公钥加密与 KEM 的区别](#八、密钥交换、公钥加密与 KEM 的区别)
-
- [8.1 公钥加密](#8.1 公钥加密)
- [8.2 密钥交换](#8.2 密钥交换)
- [8.3 KEM](#8.3 KEM)
- 九、密钥分发问题最终变成了什么
-
- [9.1 从秘密运输转向公开认证](#9.1 从秘密运输转向公开认证)
- [9.2 私钥成为新的核心资产](#9.2 私钥成为新的核心资产)
- [9.3 长期私钥泄露与前向安全](#9.3 长期私钥泄露与前向安全)
- 十、常见误区
-
- [10.1 公钥公开,所以从哪里下载都一样](#10.1 公钥公开,所以从哪里下载都一样)
- [10.2 公钥密码比对称密码高级,可以完全替代 AES](#10.2 公钥密码比对称密码高级,可以完全替代 AES)
- [10.3 使用公钥加密就自动具备身份认证](#10.3 使用公钥加密就自动具备身份认证)
- [10.4 能解密就说明密文完整](#10.4 能解密就说明密文完整)
- [10.5 密钥越长,整个协议就一定越安全](#10.5 密钥越长,整个协议就一定越安全)
- 十一、本文应该记住什么
前言
在前面的对称密码体系中,无论使用 AES、SM4,还是 ChaCha20,通信双方都必须提前持有同一份秘密密钥。只要密钥安全、算法和工作模式使用正确,对称密码就能以很低的计算成本保护大量数据。
问题在于:
如果双方还没有建立安全信道,第一把对称密钥应该怎样送过去?
直接通过网络发送,密钥可能被窃听;先把密钥加密,又需要另一把已经共享的密钥;让每两个用户提前线下交换密钥,用户数量一多,密钥数量和管理成本会迅速失控。
这就是现代密码学中著名的密钥分发问题。它不是 AES 或 SM4 算得不够安全,而是对称密码在开始工作之前,通信双方必须先解决"如何拥有同一个秘密"的前置条件。
公钥密码的出现,第一次从体系结构上改变了这个问题:用户可以公开一把密钥,同时保留另一把私钥。任何人都能使用公钥完成加密或验证,但只有私钥持有者能够解密或签名。
本文不急着进入 RSA、Diffie-Hellman 或椭圆曲线的具体数学,而是先讲清公钥密码为什么会出现:对称密码的密钥分发究竟难在哪里,公私钥结构解决了哪一部分问题,又留下了哪些新的信任边界。
Crypto 专栏:https://blog.csdn.net/r_feynman_/category_13190241.html
Crypto 密码解析实战靶场:https://blog.csdn.net/r_feynman_/category_13194584.html
一、对称密码的前提:双方必须共享同一把密钥
1.1 对称加密的基本模型
设 Alice 希望向 Bob 发送明文 M M M,双方提前共享秘密密钥 K K K。Alice 使用加密算法计算:
C = E K ( M ) C=E_K(M) C=EK(M)
Bob 收到密文 C C C 后,使用同一把密钥解密:
M = D K ( C ) M=D_K(C) M=DK(C)
正确性要求为:
D K ( E K ( M ) ) = M D_K(E_K(M))=M DK(EK(M))=M
攻击者可以截获 C C C,但只要不知道 K K K,就难以恢复 M M M。
对称密码的优势非常明显:
- 加解密速度快,适合处理大文件和高吞吐网络流量;
- 密钥和分组尺寸较小,工程实现成熟;
- AES-GCM、ChaCha20-Poly1305 等方案可以同时提供机密性与完整性;
- 软硬件生态完善,适合服务器、终端和嵌入式设备。
但整个模型隐藏了一个前提:
Alice 与 Bob 已经安全地获得同一个 K \text{Alice 与 Bob 已经安全地获得同一个 }K Alice 与 Bob 已经安全地获得同一个 K
加密算法只负责"如何使用密钥",并不自动回答"密钥从哪里来"。
1.2 为什么不能直接把密钥发过去
假设 Alice 直接通过网络发送:
text
K = 7f9a...3c21
攻击者 Mallory 如果能够监听链路,就能同时得到密钥和后续密文。此时再强的对称算法也无法提供保护,因为攻击者拥有合法解密所需的全部信息。
也不能简单地说"先把 K K K 加密再发送"。如果用另一把密钥 K 0 K_0 K0 加密:
C K = E K 0 ( K ) C_K=E_{K_0}(K) CK=EK0(K)
问题只是被向前推了一步:Alice 和 Bob 又该怎样安全共享 K 0 K_0 K0?如果继续用 K 1 K_1 K1 加密 K 0 K_0 K0,就会形成没有起点的循环。
这可以称为密钥分发中的"启动悖论":
建立安全信道需要共享密钥,但发送共享密钥又需要一条已经安全的信道。
1.3 密钥必须保密,还必须确认属于谁
密钥分发不仅要防止窃听,还要解决身份问题。Alice 需要确认自己拿到的是 Bob 的密钥,而不是攻击者替换后的密钥。
因此,一个完整的密钥建立过程至少要回答:
- 密钥是否对攻击者保密;
- 密钥是否真的与预期通信对象绑定;
- 密钥是否新鲜,而不是旧会话密钥的重放;
- 密钥是否只用于规定的算法和协议;
- 密钥泄露后能否轮换,历史通信是否仍然安全。
这说明密钥分发从来不只是"传输一串随机字节",它同时涉及保密性、身份认证、完整性和生命周期管理。
二、用户数量增加后,密钥数量为什么会失控
2.1 两个用户只需要一把共享密钥
只有 Alice 和 Bob 两名用户时,可以在线下见面,将随机密钥写入双方设备:
K A B = K B A K_{AB}=K_{BA} KAB=KBA
只要密钥没有泄露,两人就能安全通信。对于单个封闭系统,这种预共享密钥方式并没有问题。
2.2 n n n 个用户需要多少把密钥
如果任意两个用户之间都使用独立共享密钥,那么 n n n 个用户组成的系统需要:
N = ( n 2 ) N=\binom{n}{2} N=(2n)
展开为:
N = n ( n − 1 ) 2 N=\frac{n(n-1)}{2} N=2n(n−1)
例如:
| 用户数量 n n n | 两两独立共享密钥数量 |
|---|---|
| 2 | 1 |
| 10 | 45 |
| 100 | 4 950 |
| 1 000 | 499 500 |
| 10 000 | 49 995 000 |
当 n = 10 000 n=10\,000 n=10000 时,系统需要管理接近五千万组共享密钥。这里还没有计算备份、轮换、吊销、审计和设备丢失带来的额外成本。
密钥数量的增长速度约为:
N = O ( n 2 ) N=O(n^2) N=O(n2)
这就是纯粹依赖两两预共享密钥难以支撑开放互联网的直接原因。
2.3 每个用户需要保存多少密钥
在两两独立密钥模型中,每个用户需要保存与其他所有用户的共享密钥:
n − 1 n-1 n−1
如果某个用户设备被攻破,攻击者就可能获得该用户与所有其他用户之间的密钥。若系统没有明确的密钥标识和用途隔离,还可能出现一把密钥跨协议复用的问题。
2.4 群组共享一把密钥也不是理想修复
为了减少密钥数量,可以让所有用户共享同一个群组密钥:
K 1 = K 2 = ⋯ = K n = K G K_1=K_2=\cdots=K_n=K_G K1=K2=⋯=Kn=KG
这样只需要管理一把密钥,但任何一名成员都能解密其他成员的通信,也能伪造群组内其他成员发送的消息。一旦某个终端泄露,整个群组都必须更换密钥。
所以"密钥少"不一定代表系统更安全。密钥隔离程度、用户身份和泄露影响范围同样重要。
三、公钥密码出现之前,密钥是怎样分发的
3.1 线下或带外分发
最直接的方法是通过可信人员、专用设备、纸质密钥本或物理介质传递密钥。军事、外交和高安全封闭网络长期使用过类似方式。
它的优点是安全边界直观:攻击者必须介入物理交付过程。缺点也很明显:成本高、速度慢、跨地域困难,而且大规模用户系统很难频繁轮换。
这类方法今天仍然存在,例如设备出厂时预置根密钥、管理员线下写入恢复密钥、双方当面核对密钥指纹。公钥密码并没有让带外信任完全消失,而是减少了必须秘密传输的数据规模。
3.2 密钥分发中心 KDC
另一种思路是引入所有用户共同信任的密钥分发中心(Key Distribution Center,KDC)。每个用户只与 KDC 共享一把长期密钥。
Alice 与 KDC 共享:
K A K_A KA
Bob 与 KDC 共享:
K B K_B KB
当 Alice 要与 Bob 通信时,KDC 生成会话密钥 K A B K_{AB} KAB,分别使用 K A K_A KA 和 K B K_B KB 加密后发送给双方:
C A = E K A ( K A B ) C_A=E_{K_A}(K_{AB}) CA=EKA(KAB)
C B = E K B ( K A B ) C_B=E_{K_B}(K_{AB}) CB=EKB(KAB)
Alice 解密 C A C_A CA,Bob 解密 C B C_B CB,最终得到同一把会话密钥。
这种结构把密钥数量从两两关系压缩为每个用户与中心的一条关系。系统只需要管理大约 n n n 份长期用户密钥,而不是 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2 份两两密钥。
3.3 中心化方案的新问题
KDC 缓解了密钥数量问题,却引入了集中式信任:
- KDC 被攻破可能影响整个系统;
- KDC 不可用时,用户可能无法建立新会话;
- 用户必须先安全获得与 KDC 的长期密钥;
- 跨组织通信需要解决多个信任域之间的协作;
- KDC 可能知道或参与生成大量会话密钥。
Kerberos 等系统证明 KDC 模型在组织内部非常实用,但它仍然不适合作为整个开放互联网唯一的密钥分发方式。
四、公钥密码的关键突破:公开加密密钥
4.1 一对密钥承担不同职责
公钥密码为每个用户生成一对相关但用途不同的密钥:
( p k , s k ) ← KeyGen ( 1 λ ) (pk,sk)\leftarrow\operatorname{KeyGen}(1^\lambda) (pk,sk)←KeyGen(1λ)
其中:
- p k pk pk:公钥,可以公开传播;
- s k sk sk:私钥,只能由持有者秘密保存;
- λ \lambda λ:安全参数。
公钥加密的基本接口为:
C ← Enc ( p k , M ) C\leftarrow\operatorname{Enc}(pk,M) C←Enc(pk,M)
M ← Dec ( s k , C ) M\leftarrow\operatorname{Dec}(sk,C) M←Dec(sk,C)
正确性要求:
Dec ( s k , Enc ( p k , M ) ) = M \operatorname{Dec}(sk,\operatorname{Enc}(pk,M))=M Dec(sk,Enc(pk,M))=M
任何人都可以拿 Bob 的公钥加密消息,但只有持有 Bob 私钥的一方能够解密。
4.2 公钥为什么可以公开
公钥和私钥之间存在数学联系,但方案的设计目标是让攻击者难以根据公钥恢复私钥。传统公钥密码依赖不同数学难题,例如:
- RSA:大整数分解及相关问题;
- Diffie-Hellman:有限域离散对数;
- ECC:椭圆曲线离散对数;
- 后量子 KEM:格、编码等新型困难问题。
公钥并不是"泄露了一半私钥",而是算法主动公开的计算入口。安全性依赖的是:从公钥执行加密或验证容易,从公钥反推出私钥或伪造结果困难。
4.3 密钥数量从平方级降到线性级
在公钥体系中,每个用户只需要维护自己的一对密钥:
( p k i , s k i ) (pk_i,sk_i) (pki,ski)
n n n 个用户大约需要 n n n 对密钥:
N k e y p a i r = n N_{keypair}=n Nkeypair=n
不再需要为每一对用户预先准备独立共享密钥。Alice 只要获得 Bob 的公钥,就可以开始加密或建立共享密钥。
这并不表示公钥密码让密钥管理消失了,而是把问题从:
如何秘密地给每一对用户分发共享密钥?
转化为:
如何可靠地确认某个公开密钥确实属于目标用户?
前一个问题主要是保密分发,后一个问题则是公开密钥的身份认证。
五、一个完整的公钥加密通信过程
5.1 Bob 生成密钥对
Bob 本地生成公私钥:
( p k B , s k B ) ← KeyGen ( 1 λ ) (pk_B,sk_B)\leftarrow\operatorname{KeyGen}(1^\lambda) (pkB,skB)←KeyGen(1λ)
他公开 p k B pk_B pkB,严格保护 s k B sk_B skB。
5.2 Alice 使用 Bob 的公钥加密
Alice 获得 p k B pk_B pkB 后,计算:
C = Enc ( p k B , M ; r ) C=\operatorname{Enc}(pk_B,M;r) C=Enc(pkB,M;r)
其中 r r r 表示加密过程中使用的随机性。现代公钥加密通常必须是随机化的:即使明文和公钥相同,不同随机数也应产生不同密文。
Enc ( p k , M ; r 1 ) ≠ Enc ( p k , M ; r 2 ) \operatorname{Enc}(pk,M;r_1)\ne\operatorname{Enc}(pk,M;r_2) Enc(pk,M;r1)=Enc(pk,M;r2)
如果加密是完全确定性的,相同消息会产生相同密文,攻击者可以进行字典测试和重复模式分析。
5.3 Bob 使用私钥解密
Bob 收到密文后计算:
M = Dec ( s k B , C ) M=\operatorname{Dec}(sk_B,C) M=Dec(skB,C)
攻击者即使知道算法、Bob 的公钥和密文,也不应有能力恢复明文。
5.4 这个流程还缺少身份认证
如果 Alice 获取的公钥并不是真正的 p k B pk_B pkB,而是攻击者 Mallory 替换后的 p k M pk_M pkM,Alice 会执行:
C = Enc ( p k M , M ) C=\operatorname{Enc}(pk_M,M) C=Enc(pkM,M)
Mallory 可以使用自己的私钥解密,再用 Bob 的真实公钥重新加密后转发。Bob 可能完全不知道通信曾被中间人读取。
因此,公钥可以公开,并不代表可以从任何地方无条件下载。公钥分发不要求保密,但必须保证真实性和完整性。
六、中间人攻击:公钥密码没有自动解决信任
6.1 攻击过程
假设 Alice 请求 Bob 的公钥,Mallory 控制了网络:
- Bob 向 Alice 发送 p k B pk_B pkB;
- Mallory 截获并替换成 p k M pk_M pkM;
- Alice 误以为 p k M pk_M pkM 属于 Bob;
- Alice 使用 p k M pk_M pkM 加密消息;
- Mallory 使用 s k M sk_M skM 解密;
- Mallory再用 p k B pk_B pkB 加密并转发给 Bob。
双方都在使用正确的公钥密码算法,但身份绑定错误,整个通信仍然不安全。
6.2 公钥需要认证
常见的公钥认证方式包括:
- 当面或通过独立信道核对公钥指纹;
- 使用数字证书和公钥基础设施 PKI;
- 使用已经信任的密钥对新密钥签名;
- 在应用中预置可信根公钥;
- 首次使用时记录密钥,后续检测变化;
- 通过 DNSSEC、DANE 等受保护系统绑定公钥。
这些方法的共同目标是建立关系:
身份 ⟷ 公钥 \text{身份}\longleftrightarrow\text{公钥} 身份⟷公钥
公钥密码解决了"密钥可以公开传播"的问题,证书和信任体系解决的是"这个公钥究竟属于谁"。
6.3 证书也不是凭空可信
数字证书通常由认证机构使用签名证明:
Sign s k C A ( 身份信息 ∥ p k B ) \operatorname{Sign}{sk{CA}}(\text{身份信息}\mathbin{\|}pk_B) SignskCA(身份信息∥pkB)
客户端使用预置信任的 CA 公钥验证签名。信任并没有消失,而是从"线下给每一对用户分发秘密"变成"预置少量可信根,并沿证书链验证身份"。
这是一种更适合大规模开放系统的信任组织方式,但仍需要证书签发审核、私钥保护、吊销、有效期和域名验证。
七、真实系统为什么仍然使用对称密码
7.1 公钥密码并不适合直接加密大量数据
公钥运算通常比对称加密慢,密钥和密文也更大。某些公钥算法一次能处理的明文长度还受到模数、填充和编码限制。
如果直接用公钥算法加密大文件,不但效率低,还容易误用填充、分块和完整性保护。因此真实协议通常采用混合加密:
- 使用公钥密码建立或封装一个随机会话密钥;
- 使用对称 AEAD 加密业务数据。
7.2 混合加密的基本模型
发送方先生成随机会话密钥:
K s ← { 0 , 1 } κ K_s\leftarrow\{0,1\}^{\kappa} Ks←{0,1}κ
然后使用接收方公钥保护 K s K_s Ks:
C K = Enc ( p k B , K s ) C_K=\operatorname{Enc}(pk_B,K_s) CK=Enc(pkB,Ks)
再使用 K s K_s Ks 加密正文:
( C , T ) = AEAD.Enc ( K s , N , A , M ) (C,T)=\operatorname{AEAD.Enc}(K_s,N,A,M) (C,T)=AEAD.Enc(Ks,N,A,M)
发送:
( C K , N , A , C , T ) (C_K,N,A,C,T) (CK,N,A,C,T)
接收方先用私钥恢复 K s K_s Ks,再验证并解密正文。
现代协议更常使用 KEM 表达第一步:
( C K , K s ) = Encaps ( p k B ) (C_K,K_s)=\operatorname{Encaps}(pk_B) (CK,Ks)=Encaps(pkB)
K s ′ = Decaps ( s k B , C K ) K_s'=\operatorname{Decaps}(sk_B,C_K) Ks′=Decaps(skB,CK)
之后仍然交给 AEAD 处理大量数据。
7.3 两类密码不是替代关系
| 比较维度 | 对称密码 | 公钥密码 |
|---|---|---|
| 密钥结构 | 通信双方共享同一秘密 | 公钥公开、私钥保密 |
| 主要优势 | 速度快、适合大量数据 | 解决开放环境中的密钥建立与签名 |
| 主要难题 | 初始密钥如何安全共享 | 公钥如何认证、私钥如何保护 |
| 常见用途 | 数据加密、AEAD、存储加密 | KEM、密钥交换、数字签名、证书 |
| 典型算法 | AES、SM4、ChaCha20 | RSA、DH、ECC、后量子 KEM/签名 |
现代安全协议通常不是"对称密码或公钥密码二选一",而是让公钥密码负责建立信任和会话密钥,让对称密码负责保护实际数据。
八、密钥交换、公钥加密与 KEM 的区别
8.1 公钥加密
公钥加密由发送方选择消息,并使用接收方公钥产生密文:
C = Enc ( p k B , M ) C=\operatorname{Enc}(pk_B,M) C=Enc(pkB,M)
典型用途是加密短消息或会话密钥,但现代协议必须搭配安全填充和主动攻击防护。
8.2 密钥交换
密钥交换让双方各自贡献秘密材料,最后计算同一共享密钥。抽象地表示:
K A = KeyExchange ( a , P K B ) K_A=\operatorname{KeyExchange}(a,PK_B) KA=KeyExchange(a,PKB)
K B = KeyExchange ( b , P K A ) K_B=\operatorname{KeyExchange}(b,PK_A) KB=KeyExchange(b,PKA)
并满足:
K A = K B K_A=K_B KA=KB
Diffie-Hellman 和 ECDH 属于典型密钥交换机制。它们本身通常不认证身份,仍然需要签名、证书或预共享密钥防止中间人攻击。
8.3 KEM
KEM 专门封装随机共享密钥,而不是直接加密任意业务明文。其接口更适合现代协议和后量子密码:
( c , K ) = Encaps ( p k ) (c,K)=\operatorname{Encaps}(pk) (c,K)=Encaps(pk)
K ′ = Decaps ( s k , c ) K'=\operatorname{Decaps}(sk,c) K′=Decaps(sk,c)
KEM 与 AEAD 组合后形成清晰分工:KEM 建立短期密钥,AEAD 保护业务消息。
九、密钥分发问题最终变成了什么
9.1 从秘密运输转向公开认证
在纯对称体系中,主要问题是:
如何秘密发送 K \text{如何秘密发送 }K 如何秘密发送 K
在公钥体系中,公钥不需要保密,问题转化为:
如何确认 p k 属于正确的人 \text{如何确认 }pk\text{ 属于正确的人} 如何确认 pk 属于正确的人
这是一次重要转变。公开信息可以通过缓存、目录服务、证书和网络传播,系统不再需要为每一对陌生用户秘密运送一把共享密钥。
9.2 私钥成为新的核心资产
公钥可以公开,但私钥一旦泄露,攻击者可能解密消息、冒充身份或伪造签名。因此私钥需要:
- 使用密码学安全随机源生成;
- 在受控存储、HSM 或安全芯片中保护;
- 设置用途和权限边界;
- 支持轮换、吊销和备份恢复;
- 避免进入日志、错误信息和内存转储;
- 对高价值操作实施审计和多方控制。
公钥密码没有消除秘密,只是让每个用户主要保护自己的私钥,而不必与所有通信对象分别共享长期秘密。
9.3 长期私钥泄露与前向安全
如果系统直接用长期公钥加密会话密钥,攻击者保存历史密文,并在未来获得长期私钥,可能解密过去的通信。
具有前向安全性的协议会使用临时密钥交换材料,让长期身份密钥泄露后,历史会话密钥仍然难以恢复。可以把目标抽象为:
泄露长期私钥 ⇏ 恢复历史会话密钥 \text{泄露长期私钥}\not\Rightarrow\text{恢复历史会话密钥} 泄露长期私钥⇒恢复历史会话密钥
因此,现代协议不仅要问"当前密钥是否安全",还要问密钥泄露会影响过去、现在还是未来哪些数据。
十、常见误区
10.1 公钥公开,所以从哪里下载都一样
错误。公钥不需要保密,但必须防替换。没有证书、指纹或可信绑定,就可能遭遇中间人攻击。
10.2 公钥密码比对称密码高级,可以完全替代 AES
错误。公钥密码解决密钥建立、身份认证和签名,对称密码负责高效保护大量数据。现代协议通常组合使用二者。
10.3 使用公钥加密就自动具备身份认证
错误。任何人都能使用 Bob 的公钥加密。密文只能说明"设计上只有 Bob 能解密",不能证明发送者一定是 Alice。
10.4 能解密就说明密文完整
错误。裸公钥加密未必具备抗篡改能力。现代方案需要满足主动攻击下的安全目标,并与 KDF、MAC 或 AEAD 正确组合。
10.5 密钥越长,整个协议就一定越安全
错误。密钥长度只是安全的一部分。随机数、填充、证书验证、密钥用途、错误处理和侧信道中的任意一处错误,都可能绕过底层数学强度。
十一、本文应该记住什么
- 对称密码使用同一把密钥完成加解密,前提是通信双方已经安全共享密钥;
- 两两预共享密钥的数量为 n ( n − 1 ) / 2 n(n-1)/2 n(n−1)/2,用户规模扩大后会出现平方级管理成本;
- KDC 可以把密钥关系集中管理,但会引入中心化信任和单点风险;
- 公钥密码允许公钥公开、私钥保密,把问题从"秘密运输密钥"转化为"认证公开密钥";
- 未经认证的公钥仍可能被替换,公钥密码本身不会自动阻止中间人攻击;
- 真实系统通常采用混合加密:公钥算法或 KEM 建立会话密钥,对称 AEAD 加密业务数据;
- 公钥加密、密钥交换、KEM 和数字签名是不同功能,不能混为一谈;
- 公钥密码没有消灭信任和秘密,而是重新组织了信任关系和密钥管理方式。
公钥密码真正伟大的地方,并不是让某个公式变得更复杂,而是让两个此前没有共享秘密的人,有机会在开放网络中建立安全通信。
下一篇将进入公钥密码最重要的数学起点之一:单向函数、陷门函数与计算困难性,解释为什么"正向计算容易、逆向计算困难"能够成为公钥密码的基础。