[图解密码学]第5章 对称加密基础

第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 五元组

对称加密可以用五元组描述:

  1. 明文P:原始消息。
  2. 密文C:加密后的消息。
  3. 密钥K:秘密参数。
  4. 加密算法E:公开的加密规则。
  5. 解密算法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 加密与解密流程

加密流程:

  1. Alice有明文P和密钥K。
  2. Alice计算C = E(K, P)。
  3. Alice把C发送给Bob。

解密流程:

  1. Bob收到C。
  2. Bob有相同密钥K。
  3. Bob计算P = D(K, C)。
  4. 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 概念题

  1. 解释对称加密的定义和优缺点。
  2. 比较分组密码和流密码,并列举国际算法和国密算法的代表。
  3. 解释混淆和扩散的区别,并说明SM4是如何实现这两点的。
  4. 说明Feistel和SPN的区别。
  5. 解释CPA和CCA攻击模型。

5.11.2 图解题

  1. 画出对称加密五元组图。
  2. 画出Feistel结构图(标注出SM4的轮结构特点)。
  3. 画出SPN结构图。
  4. 画出流密码异或加密图。
  5. 画出密钥生命周期图。

5.11.3 计算题

  1. 计算128位密钥的密钥空间。
  2. 计算暴力搜索2^128次操作的时间。
  3. 给定明文和密钥流,计算密文。
  4. 给定C1、C2和P1,恢复P2。
  5. 分析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 常见误区红黑榜 防误用
相关推荐
Decay__35 分钟前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
ss27341 分钟前
不用向量库,我用 MySQL 跑通了蔬菜 RAG--基于 RuoYi-AI 的蔬菜种植知识库 + 智能咨询系统,普通开发机就能跑
数据库·人工智能·智慧农业·ruoyi·知识库·rag
Franciz小测测1 小时前
MySQL 增量备份实践:文件都在,为什么仍可能恢复失败?
数据库·mysql·binlog
2401_891409264 小时前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
w-w0w-w10 小时前
SQL注入
网络·数据库·sql
tianyuanwo10 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼10 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
天河归来11 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
IvorySQL11 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql