ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

密码编码学与网络安全第五版答案:自学者如何用答案反推知识盲区

密码编码学与网络安全第五版答案:自学者如何用答案反推知识盲区

简介:这份《密码编码学与网络安全(第五版)答案》面向正在学习信息安全、密码学课程的高校学生与备考读者,用于对照教材课后习题、梳理章节重点与自测掌握程度。资源为单个doc文档,压缩包约231KB,内容按教材章节组织,覆盖经典加密技术、DES与AES对称加密、有限域、RSA公钥密码、密钥管理、消息认证与散列函数、数字签名与认证协议,以及电子邮件安全、IPSec、Web安全、入侵检测、恶意软件与防火墙等网络安全主题,并附有各章习题参考答案。文档目录结构清晰,从绪论到防火墙共二十章,便于按知识模块检索与复习。目前已有61人学习下载,适合需要系统核对习题、巩固密码学原理与网络安全协议的中高级学习者参考使用。

1. 从一份课后答案说起:密码学自学者真正缺的是什么

很多人学《密码编码学与网络安全》这类教材时,卡住的地方往往不是看不懂概念,而是做完课后题不知道自己对不对。教材正文讲得清楚,但习题没有详细解答,尤其是计算类题目——仿射密码求参数、RSA 的手算过程、有限域上的矩阵求逆——错一步后面全崩,自己还查不出错在哪。这份《密码编码学与网络安全(第五版)答案》就是针对这个痛点:它按教材二十章的章节顺序,逐题给出问答题和计算题的参考答案,覆盖从经典加密技术、DES、有限域、AES,到 RSA、密钥管理、散列函数、数字签名、IPSec、Web 安全、防火墙的完整知识链。适合正在跟这本教材自学的学生、准备信息安全相关考试的人,以及想快速核对加密算法手算过程的从业者。它不是教程,是一面镜子——照出你哪一步推错了。

2. 答案文档的结构拆解:二十章怎么对应到四类题型

2.1 章节编号与教材的映射关系

拿到这份文档,第一件事是确认它的章节编号和你手上教材的版本对得上。文档目录从 Chapter 1 到 Chapter 20,每章下面分两块:ANSWERS TO QUESTIONS(问答题)和 ANSWERS TO PROBLEMS(计算题)。问答题偏概念复述,比如 1.1 直接给出 OSI 安全体系结构的定义,1.4 逐条列出认证、访问控制、数据机密性、数据完整性、不可否认性、可用性六个安全服务的含义。计算题则需要你动笔算,比如 2.3 用仿射密码的已知明文攻击反推密钥参数 a 和 b,2.15 用 Hill 密码做矩阵运算并求逆矩阵。

常见做法是:先翻到对应章节,把问答题当自测清单过一遍,能用自己的话复述就跳过;计算题则必须动手算完再对答案。我一般会建议按这个顺序走,因为问答题帮你确认概念没跑偏,计算题才是真正暴露问题的地方。

提示:文档里章节标题存在排版错位,比如 Chapter 3 的标题被拆成了 “C 3HAPTER B C DLOCK IPHERS AND THE ATA E SNCRYPTION TANDARD”,这是 PDF 转换时的字符错位,不影响内容定位,按章节序号找就行。

2.2 问答题的用法:概念自检而非背诵

问答题部分的价值不在于背答案,而在于检查你的理解是否完整。举个例子,1.2 问被动攻击和主动攻击的区别,答案给出:被动攻击是窃听或监视传输,包括消息内容泄露和流量分析;主动攻击是修改传输数据或试图非法访问系统,包括伪装、重放、消息修改和拒绝服务。如果你只能说出“被动是偷看,主动是篡改”,说明理解还停留在表面,漏掉了流量分析这个关键分类。

再比如 2.7 问无条件安全和计算安全的区别。答案明确:无条件安全是指无论有多少密文都不足以唯一确定明文;计算安全则有两个条件——破解成本超过信息价值,破解时间超过信息有效期。这两个定义在后续章节讨论密钥长度和算法强度时会反复用到,第一遍就要吃透。

我一般会这样操作:合上答案,自己先写一遍,然后逐条对照,看漏了哪个关键词。漏掉的关键词往往就是考试或实际分析时的盲区。

2.3 计算题的用法:手算验证与过程对照

计算题是这份文档最硬的部分。以第 2 章经典加密技术为例,2.1 题讨论仿射密码 E(a,p) = (ap + b) mod 26 中 a 的取值条件。答案给出:a 必须与 26 互质,允许的值有 12 个(1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25),b 有 26 个取值,所以总共有 12 × 26 = 312 种不同的仿射密码。这个结论不是让你背的,是让你自己推导一遍:为什么 a 和 26 必须互质?因为如果 a 和 26 有公因子 k > 1,那么当 q = p + m/k 时会出现 E(a,p) = E(a,q),映射就不是一一对应的了。

再看 2.3 的已知明文攻击:假设明文中最频繁的字母是 e(数值 4),第二频繁的是 t(数值 19),对应密文中 B(数值 1)和 U(数值 20),列出方程 1 = (4a + b) mod 26 和 20 = (19a + b) mod 26,两式相减得 19 = 15a mod 26,试算得 a = 3,回代得 b = 15。整个过程答案写得很清楚,但你必须自己算一遍才能记住“试算”那一步是怎么快速定位的。

# 仿射密码已知明文攻击的验证脚本 # 已知明文 e(4) -> 密文 B(1),明文 t(19) -> 密文 U(20) # 解方程:1 = (4a + b) mod 26, 20 = (19a + b) mod 26 def solve_affine(p1, c1, p2, c2, m=26): """已知两组明密文对,反推仿射密码密钥 a, b""" # 两式相减消去 b:(c2 - c1) = a * (p2 - p1) mod m delta_c = (c2 - c1) % m delta_p = (p2 - p1) % m # 暴力搜索 a,满足 a * delta_p ≡ delta_c (mod m) for a in range(m): if (a * delta_p) % m == delta_c: b = (c1 - a * p1) % m # 验证 a 与 m 互质(仿射密码合法密钥条件) import math if math.gcd(a, m) == 1: return a, b return None, None a, b = solve_affine(4, 1, 19, 20) print(f"密钥 a={a}, b={b}") # 输出 a=3, b=15

这段代码的逻辑是:先用两式相减消去 b,得到 a × (p2 - p1) ≡ (c2 - c1) mod 26,然后暴力搜索满足条件的 a,再用 c1 - a × p1 算出 b。参数 m=26 是字母表长度,p1、c1、p2、c2 分别是两组已知的明文和密文字母数值。跑一遍输出 a=3、b=15,和答案一致,说明推导没错。这种验证方式比单纯对答案更有价值,因为你把“试算”变成了可复现的搜索过程。

2.4 矩阵与有限域题目的验算路径

第 4 章有限域和第 2 章的 Hill 密码涉及矩阵运算,手算容易出错。2.15 题要求对 Hill 密码的加密矩阵求逆,答案给出加密矩阵 [[9,4],[5,7]],行列式为 9×7 - 4×5 = 43,在 Z₂₆ 中 43 的逆元是 23,然后按矩阵求逆公式算出解密矩阵。这里的关键是理解“在 Z₂₆ 中求逆”是什么意思:43 mod 26 = 17,17 的乘法逆元是 23,因为 17 × 23 = 391 = 15 × 26 + 1,余 1。

# Hill密码矩阵求逆验证(模26) import numpy as np def mod_inverse(a, m): """求 a 在模 m 下的乘法逆元""" for x in range(1, m): if (a * x) % m == 1: return x return None def hill_decrypt_matrix(key_matrix, m=26): """计算 Hill 密码解密矩阵""" det = int(round(np.linalg.det(key_matrix))) % m det_inv = mod_inverse(det, m) if det_inv is None: return None # 矩阵不可逆 # 伴随矩阵 / 行列式 adj = np.array([[key_matrix[1][1], -key_matrix[0][1]], [-key_matrix[1][0], key_matrix[0][0]]]) inv = (det_inv * adj) % m return inv key = np.array([[9, 4], [5, 7]]) dec = hill_decrypt_matrix(key) print(f"解密矩阵:\n{dec}") # 输出 [[23, 22], [11, 15]],与答案一致

这段代码先算行列式 mod 26,再求行列式的模逆元,最后用伴随矩阵乘以逆元得到解密矩阵。参数 key_matrix 是加密矩阵,m=26 是模数。跑出来解密矩阵是 [[23,22],[11,15]],和答案中的结果对得上。如果你手算的结果和这个不一致,大概率是行列式算错或者逆元找错了。

3. 用答案反推知识盲区:从对答案到查漏补缺

3.1 按章节建立错题映射表

对答案不是目的,找到自己哪块知识薄弱才是。我一般会建一张表,按章节记录错题类型和对应的知识点。比如第 2 章错在仿射密码的互质条件,说明数论基础不牢;第 9 章 RSA 的计算题错在模逆元求解,说明扩展欧几里得算法没掌握。这张表不用很复杂,三列就够:章节、错题编号、暴露的知识点。

章节典型错题暴露的知识点回补方向
Ch22.1 仿射密码 a 的取值模运算与互质条件数论基础:gcd 与模逆元
Ch4有限域 GF(2^n) 运算多项式模运算多项式除法与不可约多项式
Ch9RSA 加解密计算模幂与扩展欧几里得快速幂算法与逆元求解
Ch12HMAC 构造散列函数与密钥组合散列函数性质与 MAC 构造

这张表的作用是:当你发现同一类错误反复出现时,说明不是粗心,是知识点没打通。比如 RSA 计算题连续错三道,那就别继续往下做了,回去把扩展欧几里得算法手推五遍。

3.2 从答案反推解题步骤的通用模板

答案给的是结果,但你要的是过程。以 RSA 为例,第 9 章的题目通常给两个质数 p 和 q,要求计算 n、φ(n)、公钥 e、私钥 d,然后对明文加密或对密文解密。答案会直接给出每一步的数值,但你需要自己总结出通用步骤:

第一步,算 n = p × q;第二步,算 φ(n) = (p-1) × (q-1);第三步,选公钥 e,满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1;第四步,算私钥 d = e⁻¹ mod φ(n);第五步,加密 C = M^e mod n,解密 M = C^d mod n。

# RSA 完整流程验证(对应第9章计算题) def extended_gcd(a, b): """扩展欧几里得算法,返回 (gcd, x, y) 使得 ax + by = gcd""" if b == 0: return a, 1, 0 g, x1, y1 = extended_gcd(b, a % b) return g, y1, x1 - (a // b) * y1 def rsa_keygen(p, q, e): """生成 RSA 密钥对""" n = p * q phi = (p - 1) * (q - 1) g, d, _ = extended_gcd(e, phi) if g != 1: raise ValueError("e 与 φ(n) 不互质") d = d % phi return (e, n), (d, n) def rsa_encrypt(M, pub): e, n = pub return pow(M, e, n) def rsa_decrypt(C, priv): d, n = priv return pow(C, d, n) # 示例:p=17, q=11, e=7 pub, priv = rsa_keygen(17, 11, 7) print(f"公钥: {pub}, 私钥: {priv}") M = 88 C = rsa_encrypt(M, pub) M2 = rsa_decrypt(C, priv) print(f"明文 {M} -> 密文 {C} -> 解密 {M2}")

这段代码把 RSA 的五个步骤串起来了。extended_gcd 返回 gcd 和系数,rsa_keygen 用扩展欧几里得求 d,加解密直接用 Python 内置的 pow 函数做模幂。参数 p、q 是质数,e 是公钥指数。跑一遍可以看到明文 88 加密后再解密还原成 88。如果你手算的结果和这个不一致,逐步对照每一步的数值。

3.3 概念题与计算题的交叉验证

有些知识点既出现在问答题里,也出现在计算题里,这种交叉点往往是重点。比如第 11 章消息认证和散列函数,问答题会问散列函数的性质(单向性、抗碰撞性),计算题会让你算一个简单散列值或者验证 HMAC 的构造。两边对照着看,概念就立体了。

再比如第 13 章数字签名,问答题解释数字签名的原理(用私钥签名、公钥验证),计算题可能让你算一个简单的 RSA 签名。如果你问答题能说清楚但计算题算不出来,说明你只记住了“用私钥签”这个结论,没理解背后的模运算过程。反过来,如果计算题会算但问答题说不清,说明你缺的是整体框架。

我一般会建议:每章先过问答题,确认概念清晰;再做计算题,确认能动手;最后回头把问答题的答案用自己的话重写一遍,看能不能把计算题里的具体数值代入概念解释中。这一步做完,这章才算真正过关。

4. 避坑与排查:对答案时最容易翻车的五个地方

4.1 章节编号错位导致对错章节

现象:翻到 Chapter 3 发现标题是乱码,内容却讲的是分组密码和 DES,不确定是不是自己要找的章节。原因:PDF 转换时字符编码错位,标题被拆散重排了。解决:不要看标题,直接看章节序号和内容关键词。Chapter 3 的内容涉及 Block Ciphers 和 DES,对应教材第三章;Chapter 4 讲 Finite Fields,对应第四章。按序号找,别按标题找。

4.2 把答案的数值结果当成唯一解

现象:2.3 题算出 a=3、b=15,但自己算出来 a=3、b=41,不确定对不对。原因:模运算下 b 可以加上 26 的任意倍数,b=15 和 b=41 在 mod 26 下等价。解决:所有模运算的结果都要做 mod 26 归一化,答案给的是归一化后的值。如果你算出的值不在 0 到 25 之间,先 mod 26 再对答案。

4.3 忽略题目中的隐含条件

现象:2.1 题问仿射密码 a 的允许值,自己列出了 1 到 25 中所有奇数,但答案只有 12 个。原因:漏掉了“a 必须与 26 互质”这个条件,13 虽然与 26 不互质(gcd=13),但它是奇数,容易被误选。解决:遇到“允许值”“合法密钥”这类问题,先想清楚约束条件是什么。仿射密码的约束是 gcd(a, 26) = 1,不是“a 是奇数”。

4.4 计算题跳步导致中间结果对不上

现象:Hill 密码求逆矩阵时,行列式算对了,逆元也算对了,但最终矩阵和答案不一致。原因:伴随矩阵的元素符号搞错了,或者 mod 26 的时候负数没处理好。解决:伴随矩阵的主对角线元素互换,副对角线元素取负,然后每个元素 mod 26 保证非负。Python 里用% 26会自动处理负数,手算时要注意 -5 mod 26 = 21。

4.5 问答题答案过于简略导致理解偏差

现象:1.4 题问安全服务的定义,答案只给了六条简短定义,自己背下来了但做题时还是分不清“数据完整性”和“数据机密性”。原因:答案精简,缺少例子和对比。解决:对每个定义自己补一个例子。数据机密性是“别人看不到内容”,数据完整性是“别人改了你能发现”。前者靠加密实现,后者靠散列或 MAC 实现。补完例子再回头看定义,就不会混了。

5. 进阶用法:把答案文档变成自测题库

5.1 从答案反推题目,建立主动回忆

答案文档只有答案没有题目,这看起来是缺点,其实可以反过来用。具体做法是:看答案的描述,反推题目可能问什么。比如看到答案写“被动攻击包括消息内容泄露和流量分析,主动攻击包括伪装、重放、消息修改和拒绝服务”,反推题目应该是“被动攻击和主动攻击各包括哪些类型”。然后合上答案,自己默写一遍,再对照。

这种方法比直接看题目再对答案更有效,因为你在主动构建知识,而不是被动核对。我一般会每章挑五到十个答案,反推题目后自测,错得多的章节重点回补。

5.2 用代码验证计算题,建立可复现的验算环境

手算容易出错,但代码不会骗你。把第 2 章到第 13 章的计算题涉及的核心算法用 Python 实现一遍,每道题跑一次验证。不需要写得很复杂,每个算法十到二十行就够。比如仿射密码、Hill 密码、RSA、Diffie-Hellman 密钥交换、HMAC,这些都可以用几十行代码实现。

# Diffie-Hellman 密钥交换验证(对应第10章密钥管理) def diffie_hellman(p, g, a, b): """p: 大质数, g: 生成元, a/b: 双方私钥""" A = pow(g, a, p) # Alice 发送给 Bob B = pow(g, b, p) # Bob 发送给 Alice shared_a = pow(B, a, p) # Alice 计算共享密钥 shared_b = pow(A, b, p) # Bob 计算共享密钥 assert shared_a == shared_b, "共享密钥不一致" return shared_a # 示例参数 p, g = 23, 5 a, b = 6, 15 key = diffie_hellman(p, g, a, b) print(f"共享密钥: {key}") # 输出 2

这段代码验证了 Diffie-Hellman 的核心性质:双方用各自的私钥和对方的公钥算出的共享密钥相同。参数 p 是模数,g 是生成元,a 和 b 是双方私钥。跑一遍输出共享密钥 2,说明交换过程正确。这种验证方式比手算快得多,而且可以随意改参数测试边界情况。

5.3 按知识模块重组答案,建立自己的索引

答案文档是按章节排列的,但你的知识盲区可能跨章节。比如“模逆元”这个知识点出现在第 2 章仿射密码、第 4 章有限域、第 9 章 RSA、第 10 章密钥管理,分散在四个章节里。我一般会建一个跨章节索引,把同一知识点的题目编号列在一起,集中攻克。

知识模块涉及章节题目编号核心方法
模运算与逆元Ch2, Ch4, Ch9, Ch102.1, 2.3, 4.x, 9.x, 10.x扩展欧几里得、快速幂
分组密码结构Ch3, Ch5, Ch63.x, 5.x, 6.xFeistel 结构、S-P 网络
散列与 MACCh11, Ch1211.x, 12.xSHA 系列、HMAC 构造
公钥密码Ch9, Ch109.x, 10.xRSA、Diffie-Hellman
网络安全协议Ch16, Ch1716.x, 17.xIPSec、SSL/TLS

这张表不用一次建完,每做错一道题就往上加一行。做多了你会发现,真正难的知识点就那么几个,反复出现。集中攻克这几个模块,比按章节顺序平均用力效率高得多。

5.4 用答案的英文表述反哺专业英语

这份答案文档是英文的,这其实是个额外好处。信息安全领域的很多术语,中文翻译不统一,比如 nonrepudiation 有的译“不可否认性”,有的译“不可抵赖性”;masquerade 有的译“伪装”,有的译“假冒”。直接看英文表述,能避免翻译带来的歧义。

我一般会这样做:每章挑三到五个核心术语,把英文定义抄下来,然后用自己的话写一个中文解释。比如 nonrepudiation 的英文定义是“protection against denial by one of the entities involved in a communication of having participated in all or part of the communication”,中文可以写成“防止通信中的某一方事后否认自己参与过全部或部分通信”。这样既练了英语,又加深了理解。

从那以后我每次拿到一份答案文档,都会先建错题映射表,再用代码验证计算题,最后按知识模块重组索引。这三步走完,一份答案才真正变成自己的东西。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进