简介:《密码编码学与网络安全(第五版)》课后习题答案文档,面向信息安全、网络空间安全相关专业的本科生、研究生及自学者,可用于教材各章练习后的对照自查、备考复习与教学参考。资源为一个doc文件,体积约231KB,内容按原书20章顺序组织,从古典加密技术、对称加密(DES/AES)、有限域、公钥密码与RSA,到密钥管理、消息认证、数字签名、邮件安全、IPSec、Web安全、入侵检测和防火墙等主题,几乎每题均给出解答过程或关键思路,包含大量简答、计算与论述题的解题步骤,尤其对RSA算法、有限域运算、哈希函数等重难点有细致推导,方便读者逐章核对并理解典型题目的逻辑。已有61人学习下载,适合配合原版教材系统复习,也能帮助初学者建立密码学与网络安全的整体框架,提升解题与应试能力。
1. 密码学与网络安全第五版答案文档:别把它当答案,把它当校验基准
一份流传了十几年的《密码学与网络安全(第五版)》课后答案 doc,最危险的使用方式就是照着抄。真正把这份文档用出价值的人,会把它当成一套「待校验的基准」:每道题先用纸笔推一遍,再用 Python、OpenSSL 和哈希工具跑一遍,最后才回来看文档里的结果和你的是否一致。这个习惯能让你在考试、课设和面试前真正把 RSA、AES、哈希和数字签名这几块硬骨头啃下来,而不是只会背一个答案数字。这篇文章适合正在备考这门课、准备考研复试、或想补密码学基础的一线开发者和学生,我尽量把步骤写得可以直接照着做。
2. 先拆教材再碰答案:第五版的知识主线与题目类型对照
拿到 doc 之前,先把教材本身的骨架立起来。这份答案文档的题目顺序完全跟着教材章节走,如果你不了解章节逻辑,很容易在「这道题为什么用欧拉定理」上卡住。整本书表面看是从古典密码讲到防火墙,实际上有一条清晰的数学递进线,我把这条线拆成四层。
2.1 密码学知识主线:从替换表到椭圆曲线的四层结构
第一层是古典密码,核心是模运算和字母映射。凯撒密码、仿射密码、维吉尼亚密码、Hill 密码都在这层,答案里的计算量很小,但要掌握频率分析和模逆元的求法。第二层是对称加密,DES 和 AES 的轮函数、Feistel 结构、S 盒替换是题目集中区,教材爱考「给定密钥和明文,手动推两轮 DES」这种半计算题。第三层是非对称加密,RSA、Diffie-Hellman、椭圆曲线,数论味最重,欧拉定理、离散对数、有限域上的点加点乘全在这一层。第四层是应用安全,哈希函数、数字签名、PKI、SSL/TLS 以及防火墙与入侵检测,题目以论述和协议分析为主,计算题相对少。
四层结构和常考题型的对应关系,我建议先扫一遍这张表,再决定从头读还是跳着读。
| 层次 | 典型算法 | 核心数学工具 | 第五版常见题型 |
|---|---|---|---|
| 古典密码 | 凯撒、仿射、维吉尼亚、Hill | 模逆元、频率分析、矩阵求逆 | 加密/解密手算、统计破译 |
| 对称加密 | DES、3DES、AES | 置换、异或、S 盒、有限域 GF(2^8) | 轮函数推演、密钥长度计算、模式对比 |
| 非对称加密 | RSA、DH、ECC | 欧拉定理、扩展欧几里得、离散对数、点乘 | 密钥生成、加解密验证、共享密钥计算 |
| 应用安全 | MD5、SHA、DSA、PKI、TLS | 哈希碰撞、生日攻击、证书链 | 协议流程、签名验签、攻击场景分析 |
这张表不只是复习大纲,也直接决定你拿到答案文档后先看哪几章。如果你时间紧,第三层的 RSA 计算题和第四层的哈希长度题是性价比最高的两块,因为它们套路固定,答案文档里的推导也最完整。
2.2 第五版答案文档的常见题型与解题套路对照表
我翻过好几份第五版答案文档,也见过同学之间互相传的版本,题目类型基本跑不出五类:直接计算、算法推演、协议分析、证明题、判断题。直接计算题考的是 RSA 参数求取、AES 状态矩阵变换、哈希摘要长度这类「代公式」问题,答案通常三步以内,重点看中间过程而不是终值。算法推演题会给定输入,让你手动走一遍 DES 的一轮或 ECC 的点乘,这类题最容易在符号上出错,答案文档也最容易出现笔误。协议分析题集中在 SSL/TLS 握手、PKI 证书验证流程,答案通常是一段论述,没有唯一标准,你要做的是对照教材术语逐句核。证明题多出现在数论部分,比如证明 e d ≡ 1 mod φ(n)、证明欧拉定理的特定推论,这类题看答案时重点抓「步骤与步骤之间的逻辑连接词」。判断题则散落在每章末尾,考概念边界,比如「哈希函数一定能防止重放攻击」这种句子。
当你面对一道具体题时,用一个「题干特征 → 解题手法 → 验证工具」的对照表,能少走很多弯路。
| 题干特征 | 先做什么 | 用什么验证 |
|---|---|---|
| 给定 p、q、e 求 d | 算 n 和 φ(n),再求 e 的模逆元 | Python 的扩展欧几里得脚本 |
| 给定明文和密钥手算 AES 一轮 | 画 4×4 状态矩阵,按 SubBytes→ShiftRows→MixColumns 顺序推 | Python 调用 cryptography 库对照 |
| 给定共享参数求 DH 密钥 | 先算各自的公开值再模幂 | pow(base, a, p) 一行验证 |
| 验证消息摘要 | 找出原文对应哈希算法 | sha256sum、md5sum 命令 |
| 分析 TLS 握手过程 | 列出 ClientHello→ServerHello→证书→密钥交换 | 对照 Wireshark 抓包或教材图 |
表格里的验证工具会在第 3 章逐个展开。我的建议是,每做一个类型的题,就在答案文档那道题的旁边标一个「已验证」或「有疑问」,这样复习时能直接跳过已经跑通的部分。
2.3 拿到 doc 先做三件事:查完整性、查版本、查公式
很多人打开答案文档就开始看题,结果看到一半发现少了第 8 章,或者公式全部变成方框,心态直接崩掉。我的习惯是先用三分钟做三件检查。第一是查完整性,把 doc 的目录和教材章节对照一遍,确认每章都有对应答案,重点看第 2、第 3、第 6、第 9 章这些计算题多的章节在不在。第二是查版本,书名写着第五版,但网上流传的答案文档有时会混进第四版甚至第三版的题目,你可以挑一道 RSA 题看看参数规模,第五版常用的例题参数是 p=17、q=11、e=7 这种小素数,如果文档里出现 1024 位大素数的计算题,大概率是后面章节的补充,先标记一下。第三是查公式,老式 doc 里的数学公式通常是嵌入对象,换一个办公软件打开可能显示成乱码或空框,这时候不要急着断言文档坏了,先试试兼容模式或把文档另存为 docx 再看,后面第 4 章会专门讲这个坑。
这里先提示一点:网传的答案文档多数是学习资料而非出版社官方发布,题目编号、答案措辞都会和你的教材印刷版有出入。你手里的作业题如果和答案文档不是同一批次,一定以你的教材正文和课堂要求为准,答案文档只作校验。
3. 把答案当黑匣子:用 Python 和 OpenSSL 验证五类高频考题
这一章是整个实践的核心。我建议你把答案文档上的每一道计算题都当成一个黑匣子:题目给出输入,我们不用急着相信文档里的输出,而是自己写代码、敲命令把它跑出来,再和文档对照。这样做的价值在于,你能亲手确认公钥密码里的模逆元到底怎么算、AES 的 ECB 和 CBC 输出差在哪、哈希摘要为什么长度固定。下面三个小节被我反复使用,覆盖了这本书 80% 的计算类课后题。
3.1 用 Python 验证 RSA 与欧拉定理:三步重算私钥
RSA 题目几乎千篇一律:给定两个素数 p 和 q、公钥指数 e,求 n、φ(n)、私钥 d,然后加密或解密一段明文。别在纸上扩展开欧几里得,直接跑脚本。把下面这段存成 rsa_check.py,把题目的数值填进去:
def egcd(a, b): """扩展欧几里得,返回 (g, x, y) 使 a*x + b*y = g""" if b == 0: return a, 1, 0 g, x, y = egcd(b, a % b) return g, y, x - (a // b) * y def rsa_keygen(p, q, e): n = p * q phi = (p - 1) * (q - 1) # 欧拉函数 g, x, _ = egcd(e, phi) assert g == 1, "e 和 φ(n) 必须互素" d = x % phi # 私钥指数 return n, phi, d # 用教材/答案文档里的参数替换下面三行 p, q, e = 17, 11, 7 n, phi, d = rsa_keygen(p, q, e) print("n =", n, " φ(n) =", phi, " d =", d) # 验证:加密->解密是否回到明文 m = 88 # 题目中通常把明文按字母序号转成数字 c = pow(m, e, n) # 加密 restored = pow(c, d, n) # 解密 print("cipher =", c, " restored =", restored) assert restored == m逻辑说明:egcd 函数用递归实现了扩展欧几里得算法,返回最大公约数和一组系数。rsa_keygen 里先算 n 和 φ(n),再求 e 在模 φ(n) 下的逆元作为私钥 d。最后用 Python 内置的 pow 做模幂,加密是 pow(m, e, n),解密是 pow(c, d, n)。这里最关键的参数是 d 必须取正模值,即 x % phi,否则可能出现负数私钥。
参数说明:如果你的题目给的明文不是整数,比如是字母 "HELLO",需要先约定编码方式,最原始的方式是 A=0、B=1…Z=25 逐字符编码,但这样每个字母单独加密容易被频率分析,参考答案里若用分组数字,就按它的分组方式处理,不要混用。另外有些第五版习题会故意把 e 设成不互素的数,比如 e=2,这时断言会直接报错,这是题目的陷阱,提醒你公钥参数需要满足条件。跑完这步,答案文档里那个 d=23 之类的结果对不对,一眼就能看出来。
3.2 用 OpenSSL 验证 AES 的 ECB 与 CBC:一条命令看清填充差异
对称加密章节里,最常考的论述题是「说明 ECB 和 CBC 模式的区别」,而区分它们最直观的方式不是背定义,是把同一段明文分别加密,观察输出里相同明文块是否产生相同密文块。准备一个文本文件,里面连续放两段完全相同的 16 字节数据,然后执行下面两条命令:
# 生成两段相同的明文块(16字节×2) printf '1234567890abcdef1234567890abcdef' > block.txt # ECB 模式加密,同一明文块会产生同一密文块 openssl enc -aes-128-ecb -K 0123456789abcdef0123456789abcdef -nosalt -in block.txt | xxd -p # CBC 模式加密,相同明文块因为前一块链接而得到不同密文块 openssl enc -aes-128-cbc -K 0123456789abcdef0123456789abcdef -iv 00000000000000000000000000000000 -nosalt -in block.txt | xxd -p逻辑说明:第一段明文可以表示成两个连续的 16 字节块 A 和 A。ECB 模式每个块独立加密,所以输出必然是 C_A C_A 两段完全相同的密文;CBC 模式第一个块会和初始向量异或,第二个块会和第一块密文异或,所以即使明文块相同,输出密文也完全不同。看 xxd 输出的十六进制串,ECB 结果里会出现两个重复的 16 字节段,CBC 结果里则看不到重复,这就是教材里讲的「模式传播链路」的直接证据。
参数说明:-K 后面跟的是 128 位密钥的十六进制表示,必须 32 个十六进制字符。CBC 的 -iv 也是 32 个十六进制字符,表示 128 位初始向量。-nosalt 很关键,如果去掉,openssl 默认会加入随机盐,导致两次加密结果不可比,课后答案是没法对照的。关于环境,有一种经验情况是:OpenSSL 3.x 的 enc 命令执行旧算法时可能提示无法加载 legacy provider,解决方法是在命令前加上 -provider legacy -provider default,或者直接换用 OpenSSL 1.1.1 的发行版。这个报错不影响对模式差异的理解,但会让你在验证时卡一下。如果你用的是 Windows,在 Git Bash 或 WSL 里执行同样命令即可,输出格式完全一致。
3.3 用 sha256sum 和 Python 验证哈希与数字签名题
哈希章节的课后题常问「给定消息,计算 SHA-256 摘要」或「比较 MD5 和 SHA-1 的输出长度」。这类题最省事的验证方式是用系统自带的哈希工具。在 Linux 或 macOS 终端里:
echo -n "Cryptography and Network Security" | sha256sum echo -n "Cryptography and Network Security" | md5sum逻辑说明:echo -n 的作用是不输出末尾换行符,这一点特别重要,因为多一个换行符摘要就完全不同。把结果和答案文档对比时,要么你按答案文档的输入原样粘贴,要么你确认答案文档的输入是否包含换行。如果文档里的输入是一句话,输出的摘要串应该和华三、某云厂商在线工具算出来的一致,因为哈希算法是公开标准,不存在第二种结果。
数字签名题更偏向协议流程,比如「用私钥签名、用公钥验签」。要复现这个过程,一条龙命令如下:
# 生成 2048 位 RSA 私钥,并导出公钥 openssl genpkey -algorithm RSA -out priv.pem -pkeyopt rsa_keygen_bits:2048 openssl pkey -in priv.pem -pubout -out pub.pem # 对待签名文件做 SHA-256 哈希后签名,再进行验签 echo "message for signing" > msg.txt openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt逻辑说明:第一行生成私钥,第三行导出公钥。dgst 命令的实际流程是:先对 msg.txt 做 SHA-256 摘要,再用私钥对摘要做 RSA 运算,输出签名文件。验签命令则用公钥解开签名得到摘要,再与本地重新计算的摘要比对,一致时输出 Verified OK。答案文档里关于数字签名的论述题,只要你亲手跑过这一轮,就能准确说出「签名是私有的,验签是公开的」这句话的技术含义,而不是默写概念。
参数说明:rsa_keygen_bits 控制密钥长度,2020 年后的安全基线一般要 2048 位,课堂作业里也有用 1024 位的,但 OpenSSL 新版默认禁止生成 1024 位密钥,所以统一用 2048。如果你在第五版答案的某道题里看到 1024 位示例,可以按教材背景理解,但别在真实系统里模仿。这里提示一个关键细节:如果签名后修改了 msg.txt 哪怕一个字节,验签就会失败,这是检验你对签名作用理解最好的动手实验。
4. 答案文档使用避坑:五个反复出现的翻车现场
前几章帮你建立了验证工具链,但工具链解决了「答案对不对」,还没解决「文档本身能不能用」。我收集了身边同学和我自己遇到频率最高的五个问题,按「现象 → 原因 → 解决」的格式写,每一条都能在网上流传的答案文档版本里碰到。
4.1 打开全是乱码或公式错位
现象:doc 文件在办公软件里打开,正文还能读,但一到数学公式就变成方框、红色 x 号或整行乱码,尤其是 RSA 证明题里的大括号和分数式全部丢失。原因:老式 doc 里的公式通常是 MathType 或 OLE 嵌入对象,新版办公套件对这些对象的兼容性并不完美,而且答案文档经过多次转存,公式对象可能已经损坏。解决:先试办公软件的「兼容模式」打开,再看公式区域是否变成图片。如果还是不行,把 doc 另存为 docx,多数情况会重新渲染公式。最稳妥的兜底是找一份 pdf 版答案文档做对照,只对不上的公式直接在教材原文里找推导。用第 3 章的脚本重算一遍的结果,往往比文档里那行被截断的公式更可靠。
4.2 题目和第五版对不上,混进了旧版题
现象:你做到第 6 章哈希习题时,发现答案文档里有题目「基于 SHA-512 设计一个 MAC」,但你的教材第五版对应位置只讲到 SHA-256 之前的简史,题号也对不上。原因:答案文档在传播中被人续补过,后续章节混入了第四版甚至更早版本的补充题,而且这类内容很难通过目录检查看出来。解决:做逐章抽查。方法是从第 2 章随机抽 3 道计算题、从第 9 章随机抽 2 道题,逐一和教材的习题列表比对题号。一旦发现某个章节连续 2 道题在教材里找不到对应,就基本确定这个章节混入了旧版本题目,直接跳过即可。
4.3 参考答案本身算错了
现象:按第 3 章的 Python 脚本重算一道 RSA 题,得到的 d 是 23,答案文档上却写着 5,反复核对代入后确认文档印错了。原因:答案文档虽然是教材配套,但经过扫描转文字、手工录入、格式转换,数字和符号错误难以避免,特别是 d、φ(n) 这类长得像 0 和 5 的字符。解决:以脚本输出为准,并在文档旁边用红色标注「此答案有误」。我通常会在文档上写一行「已用 pow 验证,d=23」,这样复习时不会因为疑惑而浪费五分钟。对于证明题,文档错误通常是符号索引写错,比如把 φ(n) 写成 φ(n-1),这时你需要逐行推一遍才能发现,用代码没法直接验证,所以我的原则是:计算题信代码,证明题信推导过程,文档只作参考。
4.4 只看答案不重算,考试遇到同型题翻车
现象:有同学平时复习就是一遍遍翻答案文档,觉得 RSA、DES 都「看懂」了,结果考试时换了一组 p、q、e,或者把明文换成十六进制字符串,就卡在扩展欧几里得的迭代上。原因:密码学计算题是程序性知识,看十遍不如手写一遍。尤其是求模逆元的过程,你在纸上推和用脚本跑,肌肉记忆完全不一样。解决:把「看答案」改成「对答案」。具体做法是:先闭卷做一遍题,哪怕用笔算很慢,然后打开文档对照每一步,最后再用第 3 章的命令重算终值。三步下来的记忆强度,远超你把答案抄在笔记本上三遍。这个方法对 RSA 密钥生成和 AES 状态矩阵变换尤其有效。
4.5 直接交旧版答案,作业相似度爆表
现象:模拟项目里有一位备考同学,把答案文档里的论述题原封不动整理成作业交上去,结果被系统标记相似度过高,需要重写。原因:答案文档是公开流传的统一文本,所有用同一文档的人都提交了几乎相同的段落,答辩和查重一眼就能看出来。解决:不要把答案文档里的论述题当成最终提交版本,而是把它当「要点清单」。你用自己的话把加密流程重述一遍,替换掉文档里的默认主语和句式,引用教材里的图表,再补一个你自己跑过的 openssl 验证输出截图,这样既保留了答案的正确性,又有你的独立工作痕迹。这条只要你还在读书就永远用得上。
5. 让答案文档变成半自动复习系统:一页纸错题清单加可断言代码
最后一章,我分享一个自己用了很多年、且被多个同学复制的习惯:把答案文档从「一次性查阅工具」改造成「可重复运行的正确性基准」。具体做法是,把计算题里验证过的数字变成断言代码,存成一个 test_solutions.py 文件。以后每轮复习只需要跑一遍这个脚本,所有核心结论一目了然:
# 快速回归:把高频计算题答案写成断言 def test_rsa_known_answer(): p, q, e = 17, 11, 7 n = p * q phi = (p - 1) * (q - 1) d = pow(e, -1, phi) # Python 3.8+ 直接求模逆元 assert n == 187 and phi == 160 and d == 23 assert pow(88, e, n) == 11 # 答案文档给出的密文 def test_sha256_known_hex(): import hashlib h = hashlib.sha256(b"Cryptography").hexdigest() assert len(h) == 64 # SHA-256 摘要长度固定为 256 位 = 64 个十六进制字符这个脚本的价值不是断言本身,而是它把你的复习从「再看一遍」变成了「验证一遍」。每次复习时跑一次 pytest test_solutions.py,如果全绿,说明这些核心题你还没忘;如果红了,就去翻那一道题所在章节,而不是把整本书重新翻一遍。
写代码之外,我还会维护一张一页纸的错题优先级表,格式只有三列:题号、错误类型、下次复习时间。错误类型只写三类:计算粗心、原理不懂、文档答案错误。原理不懂的题优先重做,计算粗心的题考前再看,文档答案错误的题直接标注「以脚本为准」。这张表贴在答案文档第一页,整个复习周期不换第二张纸。
我自己就踩过「考试前一天才发现某道 RSA 答案算错」的坑,从那以后凡是用这份答案文档复习,第一件事一定是跑一遍断言脚本,把已知的坑先排除掉,再开始背论述题。这个习惯帮我在面试和考试里都少吃了几次亏,希望也能帮到你。
本文还有配套的精品资源,点击获取