☰
现代密码学复习地图:从古典代换到公钥体制的四层骨架
2026/10/28 11:00:40 网站建设 项目流程

简介:这份资源是清华大学杨波《现代密码学》第4版的配套习题与参考答案文档,面向高校密码学课程学习者、考研复习者及需要巩固古典密码与现代密码学基础的读者,可用于课后练习对照、期末备考与知识点自查。压缩包内共1个docx文件,约1.61MB,内容按教材章节组织,涵盖仿射变换、多表代换密码、线性反馈移位寄存器等典型题型。以第1章为例,参考答案完整给出仿射变换 E11,23(m)≡11m+23(mod 26) 的加密与解密验证过程,包括模逆元求解、明文与密文数字序列的逐字符计算;多表代换部分则演示了矩阵密钥 A、B 下的分组加密与解密还原,并附有由明文密文反推密钥矩阵的推导。第2章涉及3级线性反馈移位寄存器的反馈函数、输出序列与周期分析。已有5680人学习,适合作为课堂同步练习与考前查漏补缺的参考材料。

1. 现代密码学复习地图:从古典代换到公钥体制的四层骨架

现代密码学这门课,很多人第一遍学完的感觉是「散」——前面在算模 26 的仿射变换,中间跳到 LFSR 的周期证明,后面又变成 RSA 和中国剩余定理,像是四门课硬拼在一起。但真正系统梳理下来会发现,它其实有一条很清晰的主线:从「代换与置换」这类古典体制出发,进入「流密码与分组密码」的对称加密体系,再用「数论基础」撑起「公钥密码」这一层。这条线对应教材前四章,也正好是考试与复习的四块主战场。

这份笔记面向的是已经在系统学、或者正在备考的人:你需要一张能对上号的知识地图,知道每章考什么、证明题从哪下手、计算题容易在哪翻车。下面按「古典代换 → 流密码 → 分组密码 → 数论与公钥」四层展开,最后落到一份可执行的复习清单。仿射变换、多表代换、LFSR、DES、SM4、RSA 这些核心词会反复出现,因为它们就是这门课的骨架节点。

2. 古典代换密码:仿射变换与多表代换的计算套路

古典部分看起来简单,但它承担了一个重要功能:把「加密 = 可逆变换」「解密 = 求逆变换」这个观念用最小的数学成本讲透。后面所有体制,本质上都是这个观念的升级版。所以这一章不是背公式,而是要把「模运算 + 求逆元 + 分组矩阵」三件事练成肌肉记忆。

2.1 仿射变换:加密、解密与模逆元

仿射变换的加密形式是 E(m) ≡ a·m + b (mod 26),解密是 D(c) ≡ a⁻¹·(c − b) (mod 26)。关键前提是 gcd(a, 26) = 1,否则 a 没有模逆元,变换不可逆,也就不能解密。26 = 2 × 13,所以 a 不能是偶数,也不能是 13 的倍数。

以教材第 1 章第 1 题为例,a = 11、b = 23,对 "THE NATIONAL SECURITY AGENCY" 加密。先把字母转数字(A=0, B=1, …, Z=25),再逐字符代入。求 11 的逆元是这类题的第一个卡点:因为 11 × 19 = 209 = 8 × 26 + 1,所以 11⁻¹ = 19。这个逆元可以用扩展欧几里得算,也可以在小模数下直接穷举 1~25。

# 仿射变换加解密:a 必须与 26 互素 def affine_encrypt(text, a, b): return [(a * (ord(ch) - 65) + b) % 26 for ch in text if ch.isalpha()] def mod_inverse(a, m): for x in range(1, m): if (a * x) % m == 1: return x raise ValueError("a 与 m 不互素,无逆元") def affine_decrypt(cipher, a, b): inv = mod_inverse(a, 26) # 先求 a 的模逆元 return [(inv * (c - b)) % 26 for c in cipher] c = affine_encrypt("THENATIONALSECURITYAGENCY", 11, 23) print(c) # 对应密文 YWPKXYHVKXONPTJCHYBXLPKTB print(affine_decrypt(c, 11, 23)) # 还原为原明文数字序列

参数说明:a是乘数密钥,b是加数密钥,mod_inverse里遍历 1~25 找满足 a·x ≡ 1 的 x。这段代码的价值不在跑通,而在于让你看清「解密 = 先减 b 再乘逆元」的顺序不能颠倒。教材第 1 章第 2 题是反问题:已知密文和明文前两个字符 "if",反解 a、b。做法是列两个同余方程 4 ≡ 8a + b、3 ≡ 5a + b (mod 26),相减得 1 ≡ 3a,解出 a = 9、b = 10。这类「已知明密文对反推密钥」的题,本质是解线性同余方程组,考的是消元意识。

2.2 多表代换:矩阵密钥与分组运算

多表代换把单个字母的变换升级成向量变换:Cᵢ ≡ A·Mᵢ + B (mod 26),其中 A 是 n×n 矩阵,Mᵢ 是长度为 n 的明文列向量。教材第 1 章第 3 题用 4×4 矩阵、每 4 个字母一组,第 4 题用 2×2 矩阵。这里有两个高频失分点:一是分组后不足一组要补齐,二是矩阵乘法要严格按「行乘列」再取模。

解密是 Mᵢ ≡ A⁻¹·(Cᵢ − B) (mod 26),核心是求 A 在模 26 下的逆矩阵。求逆矩阵的通用流程是:先算 det(A),确认 gcd(det, 26) = 1;再求 det 的模逆元;最后用伴随矩阵乘以这个逆元。教材第 1 章第 4 题给了逆向考法——已知 "dont" 加密成 "elni",反求 2×2 矩阵 A,本质是解 4 个未知数的同余方程组。

考点关键动作常见翻车点
仿射加密字母转数字、逐字符代入忘记 A=0 而非 A=1
求模逆元扩展欧几里得或穷举没先验证 gcd(a,26)=1
矩阵加密分组、行乘列、取模分组方向搞反(行向量 vs 列向量)
矩阵解密求 det、求逆元、伴随矩阵det 与 26 不互素仍硬算

梳理下来会发现,古典部分所有题都能归到「模运算 + 线性代数」两把工具上。真正需要警惕的不是算错,而是没检查可逆性就开算——a 与 26 不互素、det 与 26 不互素,算到一半才发现无解,时间全浪费。养成「先验互素、再动笔」的习惯,这一章基本不会失分。

3. 流密码:LFSR 的周期、m 序列与破译逻辑

流密码这一章是全书证明题密度最高的地方,也是很多人第一次感到「抽象」的章节。它的核心对象是线性反馈移位寄存器(LFSR):用一个特征多项式决定反馈抽头,初始状态决定输出序列。整章围绕三个问题转——序列周期是多少、什么时候是 m 序列、知道多少明密文对能破译。

3.1 特征多项式、周期与 m 序列判定

n 级 LFSR 的输出序列周期,与特征多项式 f(x) 的性质直接挂钩。教材第 2 章反复用到的结论是:若 f(x) 是 n 次不可约多项式,且 f(x) 的阶为 2ⁿ − 1,则输出序列是 m 序列,周期为 2ⁿ − 1;若只是不可约但阶更小,周期就是那个更小的阶。第 2 题要求证明「输出序列周期等于 f(x) 的阶」,证明的关键是把序列的生成函数与 f(x) 的整除关系联系起来,再用「阶是最小的使 f(x) | xᵖ − 1 的 p」这一定义收口。

第 1 题是 3 级 LFSR、初态给定,问 4 种线性反馈函数各自的输出序列与周期。做法是枚举 4 种可能的特征多项式,逐一判断可约性:不可约且阶为 7 的给 m 序列(周期 7),可约的周期更短。这类题的手感来自「先判可约、再算阶」的顺序,顺序反了会白算。

# n 级 LFSR 输出序列模拟:taps 为反馈抽头系数 c1..cn def lfsr(init, taps, steps): state = init[:] # 初始状态,长度 n out = [] n = len(state) for _ in range(steps): out.append(state[-1]) # 输出最右位 fb = sum(taps[i] * state[i] for i in range(n)) % 2 # 反馈位 state = [fb] + state[:-1] # 右移并插入反馈位 return out # 3 级、抽头 (c1,c2,c3)=(1,0,1)、初态 100 的示例 seq = lfsr([1, 0, 0], [1, 0, 1], 14) print(seq) # 观察是否 7 位一循环

参数说明:init是初始状态向量,taps对应特征多项式的系数,steps是观察长度。判断周期的方法是把输出序列截成两段比对,找到最小重复单元。这里最容易忽略的是初态不能全零——全零状态反馈恒为 0,输出全零序列,周期为 1,不构成 m 序列。

3.2 已知明密文对破译 LFSR

流密码的密钥流 = 明文 ⊕ 密文,所以拿到明密文对就等于拿到一段密钥流。教材第 2 章第 6 题:密文 1010110110、明文 0100010001,异或得密钥流 1110100111,已知是 3 级 LFSR,列 3 个线性方程解出反馈系数。第 7 题更进一步:只知道 2n−2 位明密文对,怎么破译 n 级 LFSR?思路是把未知的 2 位明文和 2 位密文各枚举 4 种,组合成 16 种方案,逐一破解,再用 m 序列性质筛掉不合法的。

第 4 题是个反直觉的结论:m = 2s 级 LFSR 前 m+2 位是 (01)ˢ⁺¹,问第 m+3 位能否为 1。答案是不能,因为由递推关系可推出 a₁ = 0、a₂ = 1、…、a₂ₛ₊₁ = 0、a₂ₛ₊₂ = 1,再代入递推式得 a₂ₛ₊₃ = 0。这道题考的是「递推关系一旦确定,后续位被完全锁死」这一线性本质。

第 5 题统计 m 序列中 (1,1) 比特对的个数,答案是 2ⁿ⁻² − n + 1。证明靠游程分布定理:长为 i 的 1 游程有 2ⁿ⁻ⁱ⁻¹/2 个,把各长度游程贡献的相邻 (1,1) 对数累加再错位相减。这类题的难点不在结论,而在**把「比特对计数」翻译成「游程计数」**这一步转化,转化对了就是代数求和。

提示:流密码这章的证明题,八成都能归到「特征多项式性质 + 递推展开 + 游程分布」三件工具。复习时不要逐题背,而要按工具归类,看到题先问「它考的是哪件工具」。

4. 分组密码:DES 与 SM4 的结构、模式与易错证明

分组密码是全书工程味最重的一章,DES 和 SM4 是两个必须吃透的结构样本。DES 是理解 Feistel 网络和分组模式传播特性的经典载体,SM4 则是理解「对合性」和「加解密同构」的现代样本。这一章的证明题有固定套路,模式题有固定结论,抓住这两点就能稳住。

4.1 DES:补码性质、解密互逆与工作模式

教材第 3 章第 1 题证明 DES 的补码性质:明文和密钥同时逐比特取补,密文也取补,即 Y' = DES_{K'}(X')。证明的关键是看到 f 函数中「扩展后与密钥异或」这一步,取补后异或结果不变,再经过 S 盒和 P 置换,逐轮推出 R'ᵢ = R̄ᵢ、L'ᵢ = L̄ᵢ。这个结论的实战价值在第 (2) 问:穷搜索攻击的密钥空间可以从 2⁵⁶ 减半到 2⁵⁵,因为一次搜索同时覆盖 x 和 x' 两种明文情况。

第 2 题证明解密是加密的逆,靠的是把轮函数拆成 T(左右交换)和 F(含密钥的迭代),证明 T = T⁻¹、F = F⁻¹,于是 (TF)⁻¹ = TF,整个 16 轮结构自然可逆。这个证明的漂亮之处在于:DES 的可逆性不依赖 f 函数本身可逆,只依赖 Feistel 结构的对称性,这正是 Feistel 网络的设计精髓。

工作模式是高频考点,结论要背准:

模式密文出错影响明文出错影响错误传播长度
ECB仅对应明文分组仅对应密文分组1 组
CBC当前组和下一组后续所有密文组2 组,可自恢复
8 比特 CFB当前组及后续—连续 9 组

CBC 的「错误传播长度为 2 且能自恢复」是必背结论;CFB 的「1 比特错影响 9 组」来自 8 比特移位寄存器的反馈延迟,理解成「错误在移位寄存器里滞留 8 个字符周期」就记住了。

4.2 SM4 对合性与 IDEA 模运算的设计动机

SM4 的加密轮函数由加密函数 G 和数据交换 E 组成,教材第 3 章第 7 题证明其满足对合性:G 满足 G² = I(因为 T 变换的结果异或两次抵消),E 满足 E² = I(纯位置交换),于是整个轮函数对合。加密过程写成 G₀EG₁E…G₃₁R,解密写成 G₃₁EG₃₀E…G₀R,两者运算完全相同,只是轮密钥使用顺序相反。这个「加解密同构、只反用密钥」的性质,是 SM4 在硬件实现上省资源的关键。

IDEA 部分考的是「为什么模乘取 2¹⁶ + 1、模加取 2¹⁶」这种设计动机题。答案的逻辑链是:模乘要构成群,模数必须是素数,2¹⁶ 不是素数而 2¹⁶ + 1 是,所以模乘用 2¹⁶ + 1;模加要和模乘、异或保持运算独立性(分配律、结合律不跨运算成立),所以模加不能和模乘同群,取 2¹⁶。第 5 题关于模 2¹⁶ + 1 乘法实现的 6 个小问,核心是把 ab 写成 q(2ⁿ + 1) + r,再推出 r = (ab mod 2ⁿ) − (ab div 2ⁿ)(必要时加 2ⁿ + 1),本质是用移位和减法替代昂贵的模乘。

注意:DES 和 SM4 的证明题,判卷看的是「结构分解是否到位」——有没有把轮函数拆成可逆部件的复合。只写结论不写分解,拿不到过程分。

5. 数论基础与 RSA:同余、本原根与公钥体制的证明链

这一章是全书数学密度最高的部分,也是公钥密码的地基。它把前面所有「模运算」的经验正式化:欧拉定理、费马定理、中国剩余定理、Legendre 符号、本原根,最后全部汇入 RSA。复习这一章的正确姿势不是背定理,而是把每个定理和它能解决的计算题对上号。

5.1 同余工具链:欧几里得、中国剩余定理与本原根

扩展欧几里得算法是求逆元的通用工具,教材第 4 章第 4 题用表格形式展示循环过程(Q、X1、X2、X3、Y1、Y2、Y3 七列滚动),最终读出逆元。这个表格法必须练熟,因为 RSA 解密、求模逆元、解同余方程都靠它。

中国剩余定理用于解同余方程组,第 6 题的标准流程是:记 M = ∏mᵢ,算 Mᵢ = M/mᵢ,求 Mᵢ 在模 mᵢ 下的逆元,最后 x = Σ aᵢMᵢMᵢ⁻¹ (mod M)。RSA 解密的 CRT 加速(第 11 题)正是这个定理的工程应用:把模 N 的运算拆成模 p 和模 q 两个半长运算,每个模指数运算代价从 N³ 降到 (N/2)³,两个加起来是原来的 1/4,速度提升 4 倍。

本原根部分(第 8 题)考的是「求模 25 的所有本原根」。判定方法是:φ(25) = 20,对 20 的每个素因子 2 和 5,验证 g²⁰/² ≠ 1 且 g²⁰/⁵ ≠ 1 (mod 25),即 g¹⁰ ≠ 1 且 g⁴ ≠ 1。满足的 g 就是本原根,共 φ(20) = 8 个。第 9 题证明「Zₙ 是域当且仅当 n 是素数」,本质是「每个非零元有乘法逆元」等价于「n 与所有小于它的数互素」,即 n 为素数。

5.2 RSA 加解密与安全性证明

RSA 的核心公式:公开钥 (e, N),私钥 d 满足 ed ≡ 1 (mod φ(N)),加密 c ≡ mᵉ (mod N),解密 m ≡ cᵈ (mod N)。教材第 10 题给公开钥和密文求明文,标准流程是先分解 N 得 p、q,算 φ(N) = (p−1)(q−1),再用扩展欧几里得求 d,最后模指数运算还原 m。

第 12 题是个有意思的安全性题:重复平方法加密时留下的中间结果,如果被敌手拿到,如何分解 N?思路是中间结果里存在 xᵢ² ≡ xᵢ₊₁ (mod N) 的关系,若某个 xᵢ² − xᵢ₊₁ 与 N 不互素,gcd 就能给出 N 的因子。这揭示了「模幂中间值泄露 = 分解 N」的风险,是侧信道思维的入门样本。

# RSA 解密核心:由 e、N 反推 d 并还原明文 def egcd(a, b): if b == 0: return a, 1, 0 g, x, y = egcd(b, a % b) return g, y, x - (a // b) * y def rsa_decrypt(c, e, p, q): N = p * q phi = (p - 1) * (q - 1) _, d, _ = egcd(e, phi) # 扩展欧几里得求私钥 d d = d % phi return pow(c, d, N) # 模幂还原明文 print(rsa_decrypt(c=密文, e=公开指数, p=因子1, q=因子2))

参数说明:egcd返回 gcd 和贝祖系数,d取模 φ 保证落在合法区间,pow(c, d, N)是 Python 内置的快速模幂。这段代码把「分解 N → 算 φ → 求 d → 模幂」四步串起来,正是 RSA 解密的标准链路。复习时要注意:d 必须对 φ(N) 取模,否则 d 可能为负或过大,模幂结果错得莫名其妙。

提示:数论这章的证明题(如第 1、2 题的整除关系)看似抽象,其实都在考「把同余式翻译成整除式,再用整数存在性收口」。看到 a ≡ b (mod m) 就条件反射写成 a − b = km,证明就顺了。

6. 易错点清单:四章里最容易翻车的五个地方

复习到后期,拉开差距的往往不是不会,而是「以为会了其实会错」。下面五条是从这四章的计算与证明里筛出来的高频翻车点,每条按「易漏点 → 为什么漏 → 怎么补」写,建议对照自己的错题本逐条打勾。

易错点一:仿射变换的字母编号从 0 还是从 1 开始。为什么漏:不同教材、不同习题的编号约定不一致,A=0 和 A=1 混用会导致整体偏移一位,密文全错但过程看起来没错。怎么补:动笔前先在草稿纸角上写明「A=0, Z=25」,全卷统一;解出的数字序列回代时再核对首字母。

易错点二:求模逆元前没验证互素。为什么漏:题目直接给 a 或矩阵 A,默认可逆,学生顺着算下去,直到解不出整数才回头。怎么补:把「gcd(a, 26) = 1」「gcd(det(A), 26) = 1」作为固定第一步写出来,不互素就说明题目有陷阱或自己抄错了。

易错点三:LFSR 初态全零仍当 m 序列算。为什么漏:全零初态的输出序列形式上是「周期 1 的合法序列」,容易被误判。怎么补:记住 m 序列的定义要求周期为 2ⁿ − 1,全零序列周期为 1,直接排除;判断前先看初态是否非零。

易错点四:CBC 与 CFB 的错误传播长度记混。为什么漏:两个模式都涉及「反馈」,传播规律相似但数值不同,死记容易串。怎么补:用机制理解代替死记——CBC 的错误通过「上一组密文参与下一组异或」传播,所以影响 2 组后自恢复;CFB 的错误滞留在 8 比特移位寄存器里,所以影响 9 组。理解机制,数值自然推得出。

易错点五:RSA 私钥 d 忘记对 φ(N) 取模。为什么漏:扩展欧几里得返回的贝祖系数可能是负数或大于 φ 的数,直接拿去模幂会出错。怎么补:固定写d = d % phi,并在草稿上验证 e·d ≡ 1 (mod φ(N)) 成立再继续。

7. 复习落地:一份可执行的查漏补缺清单

把上面四章压缩成一张可执行的复习表,比反复翻书有效得多。我的做法是按「计算题、证明题、概念题」三类分桶,每类给出自检标准和对应章节,复习时按桶推进,而不是按页码推进。

题型自检标准对应章节建议时长占比
计算题仿射/矩阵加解密、LFSR 破译、RSA 解密能独立算对且验算第 2、3、5 章40%
证明题DES 补码与互逆、SM4 对合、LFSR 周期、RSA 加速能写出分解步骤第 3、4、5 章35%
概念题工作模式传播、IDEA 模数选择、本原根判定能说清「为什么」第 3、4、5 章25%

具体执行上,我建议用「三遍法」:第一遍按章节过知识点,只求把地图对上号;第二遍只做错题和证明题,重点看自己卡在哪一步分解;第三遍限时模拟,把计算题压到每题 8 分钟内。每遍结束后在清单上标注「已稳 / 待补 / 危险」三档,第三遍只碰「待补」和「危险」。

还有一个很实用的技巧:把每道证明题的第一步单独抄成一句话。比如「DES 补码性质 → 先证 f(R, K) = f(R̄, K̄)」「SM4 对合 → 先证 G² = I、E² = I」「LFSR 周期 → 先写生成函数与 f(x) 的整除关系」。证明题卡壳,九成是第一步没找对分解对象,把这些「起手式」背下来,比背整段证明管用。

我自己的血泪经验是:第一遍复习时总想「看懂就行」,结果考试时证明题写不出第一步,计算题在模逆元上反复翻车。从那以后我每次复习这类课,都强制走一遍「先列起手式、再验互素、最后回代验算」的流程,哪怕题目看起来很简单也不跳步。这套流程不玄学,就是把容易漏的检查点固化成动作。希望这份梳理能帮到你,把四章的知识地图真正变成你脑子里的那张图。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询