第5章 对称加密基础
本章知识地图:"对称加密总览图"。左侧是同一把钥匙打开同一把锁,表示加密和解密使用同一密钥。中间分成了两条分支:分组密码按块处理(代表:AES、SM4),流密码按位/字节处理(代表:ChaCha20、ZUC)。右侧是核心设计原则:混淆、扩散、雪崩效应。下方是Feistel结构(代表:DES、SM4)和SPN结构(代表:AES),以及IV、Nonce、填充等工程概念。

本章知识地图
本章目标:
- 理解对称加密的定义、模型和优缺点。
- 区分分组密码与流密码,掌握各自适用场景。
- 掌握国密对称算法(SM4、ZUC)的原理与应用定位。
- 理解分组长度、密钥长度、填充、IV、Nonce的作用。
- 掌握混淆、扩散、雪崩效应三个核心设计原则。
- 理解Feistel结构与SPN结构的区别。
- 了解对称加密的攻击模型:CPA、CCA、认证加密需求。
- 建立对称密钥管理的基本概念,了解国密体系的合规与改造。
5.1 什么是对称加密
5.1.1 对称加密定义
对称加密是最古老、最直观的加密方式:加密和解密使用同一把密钥。
用公式表示:
加密:C = E(K, P)
解密:P = D(K, C)
其中P是明文,C是密文,K是密钥,E是加密算法,D是解密算法。
因为加密和解密使用同一个密钥,所以叫"对称"。这与公钥密码形成鲜明对比:公钥密码加密用公钥,解密用私钥,两把钥匙不同。
图5-1是对称加密总览图。左侧一把钥匙同时连接"加密"和"解密"两个锁孔,表示同一密钥。中间分两条分支:分组密码和流密码。右侧列出核心设计原则:混淆、扩散、雪崩效应。

图5-1 对称加密总览图 左侧:同一把钥匙连接加密和解密。中间:分组密码、流密码两条分支。右侧:混淆、扩散、雪崩效应。下方:Feistel、SPN、IV、Nonce、填充。
对称加密也叫"传统密码"或"秘密密钥密码"。在公钥密码出现之前,所有加密都是对称加密。今天,对称加密仍然是加密大量数据的主力,因为它比公钥密码快得多。在中国商用密码体系中,SM4和ZUC是绝对的核心主力。
5.1.2 一把钥匙开一把锁
对称加密最好的生活类比是家门钥匙。
你有一把钥匙,既能锁门也能开门。你的家人也有一把相同的钥匙。如果钥匙丢了,任何人都能打开你家的门。如果钥匙被复制,你得换锁。
图5-2 是同一把钥匙开一把锁类比图。

图5-2 同一把钥匙开一把锁类比图 左:Alice用钥匙锁箱子。中:Eve没有钥匙,打不开。右:Bob用同一把钥匙开箱子。
这个类比揭示了对称加密的核心问题:密钥必须双方共享。如果Alice想和Bob安全通信,他们必须先共享密钥。但共享密钥本身就需要安全信道。这是一个循环难题。
5.1.3 对称加密的优缺点
对称加密的优点:
- 速度快。AES在硬件上可以达到每秒数GB的吞吐量,国密SM4的硬件实现同样极快,且面积更小,非常适合物联网(IoT)等资源受限设备。
- 适合大量数据。文件加密、磁盘加密、网络流量加密都用对称加密。
- 硬件实现高效。AES有专门的CPU指令,SM4也有专门的指令集加速(如 ARMv8 架构及国内部分芯片)。
- 密钥相对较短。128位密钥已经足够安全(AES和SM4的基准密钥长度均为128位)。
对称加密的缺点:
- 密钥分发难。双方必须提前共享密钥。
- 密钥管理复杂。n个人两两通信需要n(n-1)/2个密钥。
- 无法天然支持数字签名。因为双方共享密钥,无法证明是谁发的。
- 无法实现不可否认性。Alice和Bob都能生成相同密文。
图5-3是对称加密优缺点对比图。

图5-3 对称加密优缺点对比图 左栏优点:速度快、适合大量数据、硬件高效、密钥短。右栏缺点:密钥分发难、管理复杂、无签名、无不可否认。
5.1.4 对称加密在密码学中的位置
对称加密主要提供保密性。它不提供完整性、认证或不可否认性。
在完整的密码系统中,对称加密通常与其他技术配合:
- 与哈希函数配合:验证数据完整性(如SHA-256 或 国密SM3)。
- 与MAC配合:验证消息来源和完整性(如HMAC-SHA256 或 HMAC-SM3)。
- 与公钥密码配合:解决密钥分发问题(如RSA、ECC 或 国密SM2)。
- 与数字签名配合:提供不可否认性(如ECDSA 或 国密SM2)。
- 与标识密码配合:如国密SM9,实现基于身份的加密与签名。
图5-4是对称加密在密码学中的位置图。

图5-4 对称加密在密码学中的位置图 中心:对称加密。周围:哈希、MAC、公钥密码、数字签名。箭头标注:哈希→完整性,MAC→完整性+认证,公钥→密钥分发,签名→不可否认。
现代协议中,对称加密无处不在:
- TLS:用AES-GCM或ChaCha20-Poly1305加密HTTP流量。在国密TLCP协议中,则使用SM4-GCM或SM4-CBC+HMAC-SM3。
- IPsec:用AES加密VPN流量(国密VPN常使用SM4)。
- SSH:用AES或ChaCha20加密远程终端。
- 文件加密:用AES加密磁盘和文件。
- 消息应用:用Signal协议加密聊天。
5.1.5 常见对称加密算法概览
对称加密算法分为两大类:分组密码和流密码。
分组密码:
- DES:1977年标准,56位密钥,已不安全。
- 3DES:DES的多次应用,逐渐淘汰。
- AES:2001年标准,128/192/256位密钥,当前国际主力。
- SM4:2006年公开,2012年成为国密标准,128位分组/密钥,国内商用主力。
- Blowfish/Twofish:AES竞赛候选。
流密码:
- RC4:曾广泛使用,已不安全。
- Salsa20/ChaCha20:现代国际流密码,广泛用于TLS和移动应用。
- ZUC(祖冲之):国密流密码标准,广泛应用于4G/5G移动通信(LTE/5G加密与完整性保护)。
现代推荐:国际场景常选 AES-GCM(硬件支持好)或 ChaCha20-Poly1305(软件效率高);国内合规场景首选 SM4-GCM 或 SM4-CBC + HMAC-SM3。
图5-5是常见对称加密算法家族图。

图5-5 常见对称加密算法家族图 分组密码分支:DES→3DES→AES、SM4。流密码分支:RC4→Salsa20→ChaCha20、ZUC。现代推荐:AES-GCM、ChaCha20-Poly1305、SM4-GCM。
5.2 对称加密的基本模型
5.2.1 五元组
对称加密可以用五元组描述:
- 明文P:原始消息。
- 密文C:加密后的消息。
- 密钥K:秘密参数。
- 加密算法E:公开的加密规则。
- 解密算法D:公开的解密规则。
五元组的关系:
C = E(K, P)
P = D(K, C)
D(K, E(K, P)) = P
图5-6是对称加密五元组图。

图5-6 对称加密五元组图 五个方框:明文P、密文C、密钥K、加密算法E、解密算法D。箭头:P+K+E→C,C+K+D→P。标注:D(K,E(K,P))=P。
5.2.2 加密与解密流程
加密流程:
- Alice有明文P和密钥K。
- Alice计算C = E(K, P)。
- Alice把C发送给Bob。
解密流程:
- Bob收到C。
- Bob有相同密钥K。
- Bob计算P = D(K, C)。
- Bob得到明文P。
图5-7是加密解密流程图。

图5-7 加密解密流程图 Alice:P→E(K,P)→C→发送。信道:C。Bob:接收C→D(K,C)→P。Eve在信道旁窃听。
信道不安全。Eve可以窃听、篡改、重放。对称加密只保护保密性,不保护完整性。如果Eve篡改密文,Bob解密后得到乱码,但Bob不知道是篡改还是传输错误。
5.2.3 密钥空间与密钥长度
密钥空间是所有可能密钥的集合。密钥长度是密钥的比特数。
如果密钥长度是n位,密钥空间大小是2^n。
- 56位密钥:256≈7.2×1016种。
- 128位密钥:2128≈3.4×1038种(AES-128 与 SM4 的标准长度)。
- 256位密钥:2256≈1.2×1077种。
密钥空间大小为 2^n,经典暴力搜索复杂度为 2^n。128 位对称密钥(AES-128、SM4)在经典计算 下于可预见的未来是安全的。在量子计算 模型下,Grover 算法将对称密钥的等效安全强度降为 2^n/2:128 位降为 64 位,256 位降为 128 位。因此,对于需要长期保密的场景,推荐使用 256 位对称密钥。公钥密码面临的是 Shor 算法的多项式时间破解,性质上不是降级而是崩溃,必须迁移到后量子密码。
图5-8是密钥空间与暴力搜索图。

图5-8 密钥空间与暴力搜索图 横轴密钥长度,纵轴密钥空间(对数坐标)。
但密钥长度不是唯一安全因素。算法设计、协议、实现、密钥管理同样重要。128位AES或SM4如果IV重用,安全性可能还不如56位DES。
5.2.4 柯克霍夫原则
柯克霍夫原则:算法应该公开,只有密钥保密。
为什么?
第一,公开算法可以接受全球密码学家的检验。如果算法有弱点,会被发现并改进。
第二,算法保密不现实。算法可能被逆向工程、泄露、叛变。
第三,公开算法促进互操作和标准化。
古典密码依赖算法保密,一旦算法泄露便全线崩溃。现代密码学接受柯克霍夫原则,将安全性集中于密钥。中国的国密算法主体(如 SM2、SM3、SM4)完全遵循这一原则,算法细节公开发布并接受检验。 同时,国密体系中存在 SM1、SM7 等因特定工程与安全管理需求而保持不公开的例外,例如 SM1 仅以硬件 IP 核形式提供,其安全模型在算法评估之外,叠加了硬件物理防护的维度。
图5-9是柯克霍夫原则图。

图5-9 柯克霍夫原则图 左:古典密码------算法保密,密钥保密。右:现代密码------算法公开,密钥保密。箭头标注:"历史教训"。
5.2.5 安全目标
对称加密主要提供保密性。但完整的通信需要更多:
- 保密性:别人看不懂。对称加密提供。
- 完整性:别人改不了。需要MAC或AEAD。
- 认证:确认对方是谁。需要MAC或数字签名。
- 不可否认性:事后不能抵赖。需要数字签名。
图5-10是对称加密安全目标图。

图5-10 对称加密安全目标图 四个盾牌:保密性、完整性、认证、不可否认性。对称加密覆盖保密性,其他需要配合。
"只加密"不够安全。攻击者可以篡改密文、重放旧消息、注入伪造消息。现代推荐使用认证加密AEAD(如AES-GCM、SM4-GCM),同时提供保密性和完整性。
5.3 分组密码 vs 流密码
5.3.1 分组密码:按块处理
分组密码把明文分成固定长度的块,每块独立或关联加密。
常见分组长度:
- DES:64位(8字节)。
- AES:128位(16字节)。
- SM4:128位(16字节)。
如果明文长度不是分组长度的整数倍,需要填充。
分组密码需要工作模式来处理长消息。ECB、CBC、CTR、GCM都是工作模式。
图5-11是分组密码按块处理图。

图5-11 分组密码按块处理图 明文分成多个块:P1, P2, P3...每块经过加密算法E得到C1, C2, C3...块大小固定,需要填充,需要工作模式。
5.3.2 流密码:按位/字节处理
流密码生成一个密钥流,与明文逐位或逐字节异或。
加密:C = P ⊕ KS
解密:P = C ⊕ KS
其中KS是密钥流。
流密码不需要填充,适合实时通信。但密钥流不能重用。
图5-12是流密码密钥流异或图。

图5-12 流密码密钥流异或图 上方:密钥流KS。中间:明文P。下方:密文C=P⊕KS。逐位异或,无需填充。
5.3.3 对比表
| 特性 | 分组密码 | 流密码 |
|---|---|---|
| 处理单位 | 固定长度块 | 位/字节 |
| 填充 | 需要 | 不需要 |
| 错误传播 | 影响后续块 | 只影响对应位 |
| 同步 | 块同步 | 密钥流同步 |
| 代表算法 | DES、AES、SM4 | RC4、ChaCha20、ZUC |
| 适用场景 | 文件、磁盘 | 实时通信、移动网络 |
| 硬件效率 | 高 | 中 |
| 软件效率 | 中 | 高 |
图5-13是分组密码vs流密码对比表。

图5-13 分组密码vs流密码对比表 表格列出处理单位、填充、错误传播、同步、代表算法、适用场景、效率。
5.3.4 分组密码工作模式预告
分组密码需要工作模式来处理长消息。常见模式:
- ECB:电子密码本,不安全。
- CBC:密码块链接,需要随机IV。
- CFB:密码反馈。
- OFB:输出反馈。
- CTR:计数器模式,可并行。
- GCM:认证加密,推荐。(国密中常称 SM4-GCM)
图5-14是工作模式预告图。

图5-14 工作模式预告图 分支:ECB、CBC、CFB、OFB、CTR、GCM。
5.3.5 流密码密钥流预告
流密码的核心是密钥流生成器。密钥流必须不可预测。
密钥流通常由密钥和Nonce生成:
KS = PRNG(K, Nonce)
Nonce是一次性随机数。如果Nonce重用,密钥流重用,安全性崩溃。ZUC算法即通过密钥和计数器(Count)等参数,生成高强度的密钥流。
图5-15是流密码密钥流生成图。

图5-15 流密码密钥流生成图 输入:密钥K、Nonce。生成器:PRNG。输出:密钥流KS。标注:Nonce必须唯一。
5.4 分组密码基础
5.4.1 分组长度与密钥长度
分组长度是每次处理多少比特。密钥长度是密钥多少比特。
- DES:64位分组,56位有效密钥。
- AES:128位分组,128/192/256位密钥。
- SM4:128位分组,128位固定密钥(不支持192/256位)。
分组长度影响工作模式和安全性。64位分组在大量数据下可能遭遇生日攻击。128位分组更安全。
密钥长度影响暴力搜索复杂度。
图5-16是分组长度与密钥长度图。

图5-16 分组长度与密钥长度图 表格:DES 64/56,AES 128/128,AES 128/192,AES 128/256,SM4 128/128。标注:分组长度影响模式,密钥长度影响暴力搜索。
5.4.2 填充
明文长度不是分组长度整数倍时,需要填充。
PKCS#7填充规则:
- 缺少n字节,填充n个字节,每个字节值都是n。
- 如果刚好整除,填充一个完整块,每个字节值都是块大小。
示例:块大小8字节,明文"HELLO"(5字节),缺3字节,填充0x03 0x03 0x03。SM4同样遵循这一通用填充原则。
图5-17是PKCS#7填充示例图。

图5-17 PKCS#7填充示例图 明文HELLO(5字节),块大小8。填充3个0x03。结果:HELLO+0x03+0x03+0x03。
填充必须可逆。解密后检查最后一个字节值,去掉相应数量的填充。
填充预言攻击:攻击者通过观察填充错误,逐步恢复明文。这是CBC模式下的经典攻击。认证加密可以防止。
5.4.3 初始向量IV
IV的作用:让相同明文在相同密钥下产生不同密文。
如果没有IV,相同明文块总是产生相同密文块,泄露明文结构。
IV不需要保密,但必须:
- 不可预测(CBC模式)。
- 唯一(CTR模式)。
IV重用会导致严重安全问题。
图5-18是IV作用图。

图5-18 IV作用图 相同明文P,相同密钥K,不同IV1和IV2,产生不同密文C1和C2。IV不需要保密,但必须不可预测或唯一。
5.4.4 错误传播与同步
分组密码的错误传播取决于工作模式。
CBC模式:一个密文块出错,影响两个明文块(当前块和下一块)。
CTR模式:一个密文位出错,只影响对应明文位。
流密码:一个密文位出错,只影响对应明文位。
同步问题:如果丢失一个块,后续块可能无法解密。
图5-19是CBC错误传播图。

图5-19 CBC错误传播图 C1出错→P1全乱,P2部分乱,P3正常。错误传播两个块。
5.4.5 分组密码安全要求:PRP/PRF
理想分组密码是一个随机置换。
伪随机置换PRP:与随机置换不可区分。
伪随机函数PRF:与随机函数不可区分。
安全定义:如果攻击者无法区分分组密码和随机置换,则分组密码是安全的。SM4的安全设计同样满足PRP/PRF要求,以抵抗各种区分攻击。
图5-20是PRP/PRF示意图。

图5-20 PRP/PRF示意图 左:随机置换,每个输入唯一输出。右:分组密码,看起来像随机置换。
5.5 流密码基础
5.5.1 密钥流与异或
流密码的核心是异或运算。
异或性质:
- 0⊕0=0
- 0⊕1=1
- 1⊕0=1
- 1⊕1=0
- A⊕A=0
- A⊕0=A
加密:C = P ⊕ KS
解密:P = C ⊕ KS
因为C⊕KS = P⊕KS⊕KS = P⊕0 = P。
图5-21是流密码异或加密图。

图5-21 流密码异或加密图 明文P:10110011。密钥流KS:01101001。密文C:11011010。解密:C⊕KS=P。
5.5.2 一次性密码本理想
一次性密码本是最理想的流密码:
- 密钥流真随机。
- 密钥流与消息等长。
- 密钥流只用一次。
一次性密码本提供信息论安全:即使无限算力也无法破解。
但现实中难用:
- 真随机密钥流难以生成。
- 密钥流必须与消息等长。
- 密钥流必须安全分发。
- 密钥流不能重用。
流密码是"实用版一次性密码本":用伪随机密钥流替代真随机,用短密钥生成长密钥流。
图5-22是一次性密码本理想图。

图5-22 一次性密码本理想图 真随机密钥流+明文→密文。标注:信息论安全,但难实用。
5.5.3 同步流密码 vs 自同步流密码
同步流密码:密钥流独立于明文和密文。发送方和接收方必须同步。ZUC属于同步流密码,通信双方需保持帧号和计数器状态一致。
自同步流密码:密钥流依赖前一段密文。丢失部分密文后能自动恢复同步。
图5-23是同步vs自同步流密码图。

图5-23 同步vs自同步流密码图 左:同步流密码,密钥流独立。右:自同步流密码,密钥流依赖密文。
5.5.4 Nonce与IV在流密码中的作用
流密码通常用密钥和Nonce生成密钥流:
KS = PRNG(K, Nonce)
Nonce是一次性随机数。相同密钥下,Nonce必须唯一。
如果Nonce重用,密钥流重用,攻击者可以:
C1 = P1 ⊕ KS
C2 = P2 ⊕ KS
C1 ⊕ C2 = P1 ⊕ P2
已知一个明文,就能恢复另一个明文。
图5-24是Nonce与密钥流生成图。

图5-24 Nonce与密钥流生成图 输入:密钥K、Nonce。生成器:PRNG。输出:密钥流KS。
5.5.5 密钥流重用风险
密钥流重用是流密码的致命错误。
历史案例:
- WEP:RC4的IV重用,导致密钥恢复。
- RC4 in TLS:偏置问题,导致明文恢复。
- 索尼PS3:ECDSA随机数重用,泄露私钥。
图5-25是密钥流重用攻击图。

图5-25 密钥流重用攻击图 C1=P1⊕KS,C2=P2⊕KS。C1⊕C2=P1⊕P2。已知P1,恢复P2。
5.6 混淆与扩散
5.6.1 香农的混淆与扩散
1949年,香农在《保密系统的通信理论》中提出混淆和扩散。
混淆:隐藏密钥与密文的关系。让攻击者难以从密文推断密钥。
扩散:分散明文的统计特征。让明文一位变化影响密文多位。
这两个原则是现代分组密码设计的基石。
图5-26是混淆与扩散总览图。

图5-26 混淆与扩散总览图 左:混淆------密钥与密文关系复杂。右:扩散------明文统计分散。
5.6.2 混淆
混淆通过替换操作实现。
S盒是非线性替换。输入6位,输出4位(DES)。或输入8位,输出8位(AES)。
SM4的S盒是8进8出的非线性替换,其构造基于有限域 (GF(2^8)) 上的仿射变换和多项式求逆。
S盒设计是分组密码安全的核心。好的S盒能抵抗差分分析和线性分析。
图5-27是S盒非线性替换图。

图5-27 S盒非线性替换图 输入x,经过S盒,输出S(x)。非线性,隐藏密钥与密文关系。
5.6.3 扩散
扩散通过换位操作实现。
P盒是置换盒。输入位重新排列。
AES的行移位:每一行循环移位。
列混合:每一列线性变换。
SM4则通过循环左移和异或构造了线性变换(L函数),将S盒输出的位扩散到整个 32 位字中。
扩散让明文一位变化影响多个密文位。
图5-28是P盒扩散图。

图5-28 P盒扩散图 输入8位,经过P盒重新排列。一位输入影响多位输出。
5.6.4 雪崩效应
雪崩效应:明文一位变化,密文约一半位变化。密钥一位变化,密文约一半位变化。
这是混淆和扩散的结果。
AES雪崩效应示例:
- 明文改变1位。
- 经过1轮:约2位变化。
- 经过2轮:约10位变化。
- 经过4轮:约64位变化(一半)。
- 经过10轮:约64位变化。
SM4通过 32 轮迭代,同样能产生极佳的雪崩效应。
图5-29是雪崩效应示意图。

图5-29 雪崩效应示意图 明文一位变化,密文约一半位变化。横轴轮数,纵轴变化位数。
5.6.5 替换与换位在现代分组密码中的体现
DES:
- S盒替换(混淆)。
- P盒换位(扩散)。
- 16轮迭代。
AES:
- SubBytes替换(混淆)。
- ShiftRows换位(扩散)。
- MixColumns扩散。
- AddRoundKey密钥混合。
- 10/12/14轮迭代。
SM4:
- S盒替换(混淆)。
- 线性变换 L(实现 32 位字内的扩散)。
- 32轮迭代,采用了非平衡 Feistel 结构。
图5-30是DES/AES中的替换与换位图。

图5-30 DES/AES/SM4中的替换与换位图 左:DES------S盒替换,P盒换位。右:AES------SubBytes替换,ShiftRows换位,MixColumns扩散。SM4------S盒替换,循环移位异或。
5.7 Feistel结构 vs SPN结构
5.7.1 Feistel结构原理
Feistel结构把明文分成左右两半。
每轮:
Li+1=Ri L_{i+1} = R_i Li+1=Ri
Ri+1=Li⊕F(Ri,Ki)其中F是轮函数,Ki是子密钥。 R_{i+1} = L_i ⊕ F(R_i, K_i) 其中F是轮函数,K_i是子密钥。 Ri+1=Li⊕F(Ri,Ki)其中F是轮函数,Ki是子密钥。
轮函数F不需要可逆。这是Feistel结构的最大优点。
代表算法:DES、3DES、Blowfish、Twofish。以及国密 SM4(广义 Feistel 结构,每次处理 1/4 的块,即 32 位)。
图5-31是Feistel结构图。

图5-31 Feistel结构图 明文分L0和R0。每轮: L_{i+1}=R_i,R_{i+1}=L_i⊕F(R_i,K_i)。 经过n轮得到密文。
5.7.2 Feistel加解密对称性
Feistel结构加密和解密使用相同算法。
加密:子密钥顺序K1, K2, ..., Kn。
解密:子密钥顺序Kn, ..., K2, K1。
这是因为Feistel每轮操作可逆:
Li=Ri+1⊕F(Li+1,Ki) L_i = R_{i+1} ⊕ F(L_{i+1}, K_i) Li=Ri+1⊕F(Li+1,Ki)
Ri=Li+1 R_i = L_{i+1} Ri=Li+1
SM4 同样采用了这种加解密结构高度对称的设计,解密时只需将轮密钥逆序。
图5-32是Feistel加解密对称图。

图5-32 Feistel加解密对称图 加密:K1→K2→...→Kn。解密:Kn→...→K2→K1。
5.7.3 SPN结构原理
SPN结构每轮包括:
- 替换(S盒)。
- 换位(P盒)。
- 密钥混合(异或子密钥)。
所有操作可逆。加密和解密不同,但结构相似。
代表算法:AES。国际算法中还有 PRESENT 等。
图5-33是SPN结构图。

图5-33 SPN结构图 明文→异或子密钥→S盒替换→P盒换位→异或子密钥→...→密文。标注:所有操作可逆。
5.7.4 对比:DES vs AES vs SM4
| 特性 | DES | AES | SM4 |
|---|---|---|---|
| 结构 | Feistel | SPN | 广义Feistel |
| 分组长度 | 64位 | 128位 | 128位 |
| 密钥长度 | 56位 | 128/192/256位 | 128位 |
| 轮数 | 16 | 10/12/14 | 32 |
| 安全性 | 已破解 | 安全 | 安全 |
| 应用场景 | 淘汰 | 国际通用 | 国内强制合规 |
图5-34是DES vs AES结构对比图。

图5-34 DES vs AES vs SM4结构对比图
左:DES Feistel,64位分组,56位密钥。中:AES SPN,128位分组。右:SM4 广义Feistel,128位分组。(建议在图中加入SM4列)
5.7.5 轮函数、轮密钥、轮数
轮函数:每轮核心变换。DES的F函数,AES的SubBytes+ShiftRows+MixColumns,SM4的轮函数包含S盒和L线性变换。
轮密钥:从主密钥扩展。DES的48位子密钥,AES的128位轮密钥,SM4的32位轮密钥(由128位主密钥扩展为32个32位子密钥)。
轮数:越多越安全但越慢。DES 16轮,AES 10/12/14轮,SM4 32轮。
密钥扩展算法:从主密钥生成轮密钥。必须避免弱密钥。SM4的密钥扩展算法与加密算法结构类似,具有良好的扩散性,无已知弱密钥。
图5-35是轮函数与轮密钥图。

图5-35 轮函数与轮密钥图 主密钥→密钥扩展→轮密钥K1,K2,...,Kn。每轮:轮函数+轮密钥。
5.8 对称加密的安全要求与攻击模型
5.8.1 语义安全
语义安全:攻击者无法从密文区分两个明文。
形式化:攻击者选择两个明文P0和P1,收到其中一个的密文,无法判断是哪个。
语义安全要求相同明文每次加密产生不同密文。这需要随机化(IV/Nonce)。
图5-36是语义安全示意图。

图5-36 语义安全示意图 攻击者选P0和P1。挑战者随机选一个加密。攻击者猜哪个。
5.8.2 选择明文攻击CPA
CPA:攻击者可以选择明文并获得对应密文。
目标:区分密文或恢复密钥。
ECB模式不满足CPA安全:相同明文块产生相同密文块。
CBC、CTR需要随机IV才能满足CPA安全。
图5-37是CPA攻击模型图。

图5-37 CPA攻击模型图 攻击者→选择明文→加密 oracle→获得密文。标注:ECB不安全,CBC/CTR需要随机IV。
5.8.3 选择密文攻击CCA
CCA:攻击者可以选择密文并获得对应解密。
目标:恢复明文或密钥。
填充预言攻击:攻击者提交修改后的密文,观察解密是否报填充错误,逐步恢复明文。
认证加密可以防止CCA。
图5-38是CCA与填充预言图。

图5-38 CCA与填充预言图 攻击者→修改密文→解密 oracle→观察错误。逐步恢复明文。标注:认证加密防止。
5.8.4 认证加密需求
只加密不认证易受篡改。
AEAD:同时提供保密性和完整性。
组成:
- 加密算法:AES、ChaCha20、SM4。
- MAC算法:GHASH、Poly1305、SM3。
- 组合:AES-GCM、ChaCha20-Poly1305、SM4-GCM。
图5-39是AEAD组成图。

图5-39 AEAD组成图 加密算法+MAC算法=AEAD。示例:AES+GHASH=AES-GCM,ChaCha20+Poly1305=ChaCha20-Poly1305,SM4+SM3=国密AEAD。
5.8.5 常见误用
- ECB模式:泄露明文结构。
- IV重用:相同明文相同密文。
- 密钥重用:跨协议风险。
- 填充预言:CBC模式攻击。
- 无认证:篡改无法检测。
图5-40是常见误用红黑榜。

图5-40 常见误用红黑榜 红榜:ECB、IV重用、密钥重用、无认证。黑榜:CBC+随机IV、GCM、ChaCha20-Poly1305、AEAD。
5.9 对称密钥管理入门
5.9.1 密钥生成
使用CSPRNG生成密钥。
密钥长度选择:
- 128位 :在经典计算 下足够安全;但在面临量子计算(Grover算法)威胁时,有效安全强度减半(约64位),抗量子能力不足。
- 256位 :即使在量子计算威胁下,依然能提供约128位的安全强度,具有更高的安全边际,是抗量子安全的首选。
避免弱密钥。DES有弱密钥,AES没有已知弱密钥,SM4同样没有已知弱密钥。
图5-41是密钥生成流程图。

图5-41 密钥生成流程图 CSPRNG→随机比特→密钥。标注:使用密码学安全随机数生成器。
5.9.2 密钥分发
对称密钥分发难题:双方必须共享密钥。
解决方案:
- 密钥封装:用公钥加密对称密钥(国际:RSA/ECC;国内:SM2)。
- 密钥交换:DH协商对称密钥(国际:ECDHE;国内:SM2密钥交换)。
- 密钥分发中心:KDC。
图5-42是密钥分发图。

图5-42 密钥分发图 Alice和Bob通过KDC或公钥密码协商对称密钥。
5.9.3 密钥轮换
为什么轮换:
- 限制密钥泄露影响。
- 满足合规要求。
- 前向保密。
轮换周期:根据数据敏感度和风险决定。在国密改造中,密评(商用密码应用安全性评估)对密钥的轮换周期有明确的规范要求。
图5-43是密钥轮换图。

图5-43 密钥轮换图 密钥K1→使用→轮换→K2→使用→轮换→K3。标注:限制泄露影响。
5.9.4 密钥销毁
安全销毁密钥:
- 内存清零。
- 防止密钥残留。
- 销毁记录。尤其是在使用国密硬件密码机(HSM)或安全芯片时,需遵循国家密码管理局的销毁规范。
图5-44是密钥销毁图。

图5-44 密钥销毁图 密钥→内存清零→销毁记录。
5.9.5 密钥生命周期图
生成→分发→使用→轮换→销毁。
每个阶段都有安全要求。
图5-45是密钥生命周期图。

图5-45 密钥生命周期图 五个阶段:生成、分发、使用、轮换、销毁。每个阶段标注安全要求。
5.10 本章小结
图5-46是本章一页复习图。

图5-46 第5章一页复习图
对称加密模型:五元组、密钥空间、柯克霍夫。分组vs流:按块vs按位,SM4 vs ZUC。混淆与扩散:S盒、P盒、雪崩。Feistel vs SPN:DES vs AES vs SM4。攻击模型:CPA、CCA、AEAD。密钥管理:生成、分发、轮换、销毁。
关键术语:
- 明文、密文、密钥、加密、解密
- 分组密码、流密码、密钥流、SM4、ZUC
- 填充、IV、Nonce
- 混淆、扩散、雪崩效应
- Feistel、SPN、轮函数、轮密钥
- CPA、CCA、AEAD、密评
常见问题:
对称加密和公钥密码有什么区别?
对称加密使用同一密钥,速度快,适合大量数据;公钥密码使用不同密钥,解决密钥分发,但慢。
分组密码和流密码怎么选?
分组密码适合文件和磁盘,流密码适合实时通信。现代推荐AEAD。国内应用通常使用 SM4-GCM 或 ZUC。
为什么需要IV?
让相同明文产生不同密文,防止模式泄露。
为什么不能重用密钥流?
重用导致C1⊕C2=P1⊕P2,已知一个明文可恢复另一个。
为什么ECB模式不安全?
相同明文块产生相同密文块,泄露明文结构。
什么是认证加密?
同时提供保密性和完整性的加密,如AES-GCM、ChaCha20-Poly1305、SM4-GCM。
国密SM4和AES有什么区别?
两者都是128位分组和密钥的分组密码,安全性相当。主要区别在于底层结构(SM4为非平衡Feistel,AES为SPN)以及S盒设计不同。SM4更适合国内合规场景。
常见误区:
- 加密就等于安全。
- IV可以重复使用。
- 密钥越长越安全。
- 流密码不需要Nonce。
- ECB模式可以用。
- 填充无关紧要。
图5-47是常见误区红黑榜。

图5-47 常见误区红黑榜 红榜:加密=安全、IV重用、密钥越长越安全、ECB可用。黑榜:加密+认证、IV唯一、密钥管理、AEAD。
5.11 习题与实验
5.11.1 概念题
- 解释对称加密的定义和优缺点。
- 比较分组密码和流密码,并列举国际算法和国密算法的代表。
- 解释混淆和扩散的区别,并说明SM4是如何实现这两点的。
- 说明Feistel和SPN的区别。
- 解释CPA和CCA攻击模型。
5.11.2 图解题
- 画出对称加密五元组图。
- 画出Feistel结构图(标注出SM4的轮结构特点)。
- 画出SPN结构图。
- 画出流密码异或加密图。
- 画出密钥生命周期图。
5.11.3 计算题
- 计算128位密钥的密钥空间。
- 计算暴力搜索2^128次操作的时间。
- 给定明文和密钥流,计算密文。
- 给定C1、C2和P1,恢复P2。
- 分析ECB模式下相同明文块的密文。
5.11.4 实验一:Python实现简单异或流密码
生成伪随机密钥流,加密解密,演示密钥流重用攻击。

5.11.5 实验二:观察AES与SM4分组与填充
使用Python cryptography库(或GmSSL)观察AES的填充与分组;使用 GmSSL 或 Python 的 gmssl 库,观察 SM4 的加密过程,对比 ECB 和 CBC 模式。

5.11.6 实验三:Feistel玩具密码
实现简单Feistel结构,加密解密,观察轮函数和子密钥。

5.11.7 实验四:IV重用攻击演示
CBC模式下重用IV,观察相同明文产生相同密文,分析信息泄露。

5.11.8 延伸阅读
- 香农《保密系统的通信理论》。
- NIST分组密码工作模式文档。
- AES标准FIPS 197。
- 国家密码管理局《SM4分组密码算法》标准文档。
- GmSSL官方文档与商用密码应用指南。
- 流密码设计入门。
第5章配图总清单
| 编号 | 配图名称 | 用途 |
|---|---|---|
| 图5-1 | 对称加密总览图 | 章首大图 |
| 图5-2 | 同一把钥匙开一把锁类比图 | 建立直觉 |
| 图5-3 | 对称加密优缺点对比图 | 总览 |
| 图5-4 | 对称加密在密码学中的位置图 | 定位 |
| 图5-5 | 常见对称加密算法家族图 | 算法概览(含国密) |
| 图5-6 | 对称加密五元组图 | 基本模型 |
| 图5-7 | 加密解密流程图 | 流程 |
| 图5-8 | 密钥空间与暴力搜索图 | 密钥长度 |
| 图5-9 | 柯克霍夫原则图 | 原则 |
| 图5-10 | 对称加密安全目标图 | 安全目标 |
| 图5-11 | 分组密码按块处理图 | 分组密码 |
| 图5-12 | 流密码密钥流异或图 | 流密码 |
| 图5-13 | 分组密码vs流密码对比表 | 对比(含SM4/ZUC) |
| 图5-14 | 工作模式预告图 | 预告 |
| 图5-15 | 流密码密钥流生成图 | 流密码 |
| 图5-16 | 分组长度与密钥长度图 | 分组基础 |
| 图5-17 | PKCS#7填充示例图 | 填充 |
| 图5-18 | IV作用图 | IV |
| 图5-19 | CBC错误传播图 | 错误传播 |
| 图5-20 | PRP/PRF示意图 | 安全定义 |
| 图5-21 | 流密码异或加密图 | 流密码 |
| 图5-22 | 一次性密码本理想图 | 流密码 |
| 图5-23 | 同步vs自同步流密码图 | 流密码分类 |
| 图5-24 | Nonce与密钥流生成图 | Nonce |
| 图5-25 | 密钥流重用攻击图 | 攻击 |
| 图5-26 | 混淆与扩散总览图 | 设计原则 |
| 图5-27 | S盒非线性替换图 | 混淆(含SM4) |
| 图5-28 | P盒扩散图 | 扩散 |
| 图5-29 | 雪崩效应示意图 | 雪崩效应 |
| 图5-30 | DES/AES/SM4中的替换与换位图 | 现代继承 |
| 图5-31 | Feistel结构图 | 结构(含SM4) |
| 图5-32 | Feistel加解密对称图 | 结构 |
| 图5-33 | SPN结构图 | 结构 |
| 图5-34 | DES vs AES vs SM4结构对比图 | 对比 |
| 图5-35 | 轮函数与轮密钥图 | 轮结构 |
| 图5-36 | 语义安全示意图 | 安全要求 |
| 图5-37 | CPA攻击模型图 | 攻击模型 |
| 图5-38 | CCA与填充预言图 | 攻击模型 |
| 图5-39 | AEAD组成图 | 认证加密 |
| 图5-40 | 常见误用红黑榜 | 防误用 |
| 图5-41 | 密钥生成流程图 | 密钥管理 |
| 图5-42 | 密钥分发图 | 密钥管理 |
| 图5-43 | 密钥轮换图 | 密钥管理 |
| 图5-44 | 密钥销毁图 | 密钥管理 |
| 图5-45 | 密钥生命周期图 | 密钥管理 |
| 图5-46 | 第5章一页复习图 | 小结 |
| 混淆与扩散总览图 | 设计原则 | |
| 图5-27 | S盒非线性替换图 | 混淆(含SM4) |
| 图5-28 | P盒扩散图 | 扩散 |
| 图5-29 | 雪崩效应示意图 | 雪崩效应 |
| 图5-30 | DES/AES/SM4中的替换与换位图 | 现代继承 |
| 图5-31 | Feistel结构图 | 结构(含SM4) |
| 图5-32 | Feistel加解密对称图 | 结构 |
| 图5-33 | SPN结构图 | 结构 |
| 图5-34 | DES vs AES vs SM4结构对比图 | 对比 |
| 图5-35 | 轮函数与轮密钥图 | 轮结构 |
| 图5-36 | 语义安全示意图 | 安全要求 |
| 图5-37 | CPA攻击模型图 | 攻击模型 |
| 图5-38 | CCA与填充预言图 | 攻击模型 |
| 图5-39 | AEAD组成图 | 认证加密 |
| 图5-40 | 常见误用红黑榜 | 防误用 |
| 图5-41 | 密钥生成流程图 | 密钥管理 |
| 图5-42 | 密钥分发图 | 密钥管理 |
| 图5-43 | 密钥轮换图 | 密钥管理 |
| 图5-44 | 密钥销毁图 | 密钥管理 |
| 图5-45 | 密钥生命周期图 | 密钥管理 |
| 图5-46 | 第5章一页复习图 | 小结 |
| 图5-47 | 常见误区红黑榜 | 防误用 |