简介:围绕华中科技大学可信计算线上测试整理的题目与答案文档,面向网络安全专业学生、可信计算课程学习者以及准备课程测验的读者,用于快速定位考点、核对答题思路并完成考前自测。压缩包内仅有1个docx文件,大小约558KB,以问答形式编排,适合在电脑或平板上直接查阅。内容覆盖可信计算理论担忧与信任链、TPM芯片与CPU连接及TSS软件栈、MD4/MD5/SHA-1等Hash算法的性质、DES/AES/RC5/Blowfish与RSA/ElGamal/ECC的特点和应用场景,并延伸到PKI与证书公私钥关系、PCR数量、TPM远程与本地报告、可迁移密钥等考点。已有331人学习下载,可用于考前对照复习、课堂知识点查漏补缺,以及梳理可信计算与密码学基础概念之间的关联。单文件结构轻量,问题划分明确,便于按主题检索和反复查阅,也方便在复习时按问题逐条核对答案。
1. 可信计算线上测试到底在考什么:从一道远程证明题说起
前阵子帮一位学弟复盘某高校的可信计算线上测试,最后一道大题给了一段 quote 报文和一组 PCR 值,问「验证方凭什么相信这组度量来自一台没被改过的机器」。他把「可信根、度量、存储、报告、验证」五个词背得滚瓜烂熟,考场上还是一个空都填不出来。可信计算线上测试的难点从来不在名词数量,而在你没法把抽象链条落到一个具体动作上:PCR 是谁写的、EK 和 AK 谁签谁、nonce 到底防的是什么。这篇笔记按「概念—实验—题型—踩坑」的顺序,把可信计算线上测试的复习路径拆成能自己复现的步骤,适合要应付课程测评、认证考试,或者准备把 TPM/TCM 接进自己系统的同学。答案不用背,能推出答案的链路只有一条。
2. 把可信根讲透:PCR、EK、AK 在卷子上到底怎么考
可信计算线上测试里失分最集中的一块,是「可信根」这一层。题目往往不直接问定义,而是给你一段启动流程或者一个密钥用途,让你判断哪一步破坏了信任链。要答对这类题,光记住「TPM 是可信根」没用,得知道可信根往下分了几层、每层负责什么、哪一层是不可度量的公理。
2.1 SPT、CRTM 与 SRTM:为什么第一个被执行的代码反而没人度量
可信计算体系里有一条不太符合直觉的设定:整条度量链的起点,本身是不可被度量的。这个起点叫 CRTM(Core Root of Trust for Measurement),通常固化在主板固件里,是上电后 CPU 执行的第一段代码。它负责度量 BIOS 的其余部分,把结果写进 PCR,然后把控制权交出去。因为在这段代码之前没有任何可信的代码能度量它,所以它只能靠物理保护(比如固件写保护、Boot Block 只读)来保证完整性,而不是靠密码学。
以 CRTM 为根的这套机制叫 SRTM(Static Root of Trust for Measurement),静态可信根。线上测试喜欢在这里设一个追问:「SRTM 能不能防御对 BIOS 刷写的攻击?」标准答案是部分不能——如果攻击发生在 CRTM 之前,或者攻击者能改写 CRTM 本身,那么后续所有度量值都是「自洽的谎言」,PCR 看起来正常,实际整条链已经被污染。这个缺陷催生了 DRTM(Dynamic Root of Trust for Measurement),用 CPU 提供的 late launch 指令在任意时刻重建一个干净的度量环境,不依赖固件。CPU 厂商各自的实现名字不同,考题里一般只要求你说出「动态可信根不依赖静态启动路径,可对抗早期固件篡改」这个结论。
国内教材还会引入 TCM 和 TPCM 两个概念。TCM 是可信密码模块,可以理解为采用国密算法套件的可信芯片,功能定位与 TPM 类似;TPCM 强调「主动度量」,即先度量再执行,而不是 TPM 那种「先执行再记录」的被动模式。考试里常见的混淆点是:把 TPCM 的「主动」理解成「TPM 的升级版」,其实两者的信任模型不同——TPM 记录事实,TPCM 参与决策。
2.2 用 tpm2-tools 在本地跑通一次 PCR 扩展
概念讲完必须动手,否则 PCR 的哈希链在脑子里永远是玄学。找一台带 TPM 2.0 的机器(或者用软件模拟器),装好 tpm2-tools,先看当前 PCR 状态。
# 读取 PCR 0-7 的 SHA256 值,这是启动阶段固件写入的部分 tpm2_pcrread sha256:0,1,2,3,4,5,6,7 # 往 PCR 8 里扩展一段自定义数据,模拟一次运行时的度量事件 tpm2_pcrextend 8:sha256=0x9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 # 再读一次,确认 PCR 8 变成了新值 tpm2_pcrread sha256:8这段命令的关键在tpm2_pcrextend的参数格式:索引:算法=数据。索引必须是该算法下允许 extend 的 PCR,数据要给十六进制串。扩展后的新值不是简单的哈希替换,而是new = H(old || H(data)),也就是说旧值参与了计算,任何一次历史度量都无法被抹掉,这正是 PCR 只能扩展不能写入的原因。
自己验证一遍这个公式,比背十遍定义管用:
import hashlib def pcr_extend(pcr_old: bytes, data: bytes) -> bytes: """按 TPM 2.0 规范计算扩展后的 PCR 值:H(old || H(data))""" digest = hashlib.sha256(data).digest() # 先对本次度量数据做哈希 return hashlib.sha256(pcr_old + digest).digest() # 再与旧值拼接后哈希 # 假设 PCR 8 原值为全 0,扩展一次 "hello" old = b"\x00" * 32 new = pcr_extend(old, b"hello") print(new.hex())跑完把输出和tpm2_pcrread sha256:8的结果对一下,一致就说明公式记对了。注意两个细节:拼接顺序是「旧值在前、新哈希在后」,写反了结果完全不同;参与拼接的是数据的哈希值,不是数据原文,如果直接把原文拼进去,长数据会把 PCR 缓冲区撑爆,规范里也是不允许的。
这一步在考卷上的体现,通常是给你三个 PCR 初始值和三条度量记录,让你手算最终值。很多人卡在「多次扩展时用哪个作为旧值」——答案是上一次的结果,链式滚下去,中间任何一步算错后面全错。
2.3 EK 与 AK:两道最容易张冠李戴的密钥题
线上测试里几乎必考 EK(Endorsement Key,背书密钥)和 AK(Attestation Key,证明密钥)的区别,出题方式有判断题也有简答。把下面这张表记住,比背定义有用得多:
| 维度 | EK 背书密钥 | AK 证明密钥 |
|---|---|---|
| 生成时机 | TPM 出厂或首次初始化时生成 | 使用方按需生成 |
| 是否可迁移 | 不可迁移,与芯片绑定 | 可在 TPM 间迁移(取决于模板) |
| 主要用途 | 证明「这是一个真的 TPM」,用于解密制造凭证 | 对 PCR 值签名,用于远程证明 |
| 证书签发方 | 芯片厂商或平台厂商 | 由 EK 或本地 CA 签发 |
| 典型命令 | tpm2_createek | tpm2_createak |
实际建一次就清楚了:
# 创建 EK,输出上下文文件和公钥 tpm2_createek -c ek.ctx -G rsa -u ek.pub # 基于 EK 创建 AK,指定签名算法为 RSASSA tpm2_createak -C ek.ctx -c ak.ctx -G rsa -gs rsassa -u ak.pub -n ak.name-C指定用来保护新密钥的父对象,AK 以 EK 为父;-G是密钥类型,-gs是签名方案,-n输出密钥名(name),这个名字是公钥区域的哈希,后续做 quote 校验时会用到。参数写错时最常见的报错是父对象句柄无效,原因多半是ek.ctx没有先加载进 TPM。
考题常在这里埋一个陷阱:「EK 能不能直接对 PCR 签名完成远程证明?」答案是技术上可以但规范不建议——EK 是受限密钥,主要职责是解密制造凭证以证明身份,长期私钥暴露在签名操作里会扩大攻击面;正确做法是用 EK 签发的 AK 证书建立信任,再由 AK 签署 quote。这个「职责分离」的思路,是简答题的得分核心。
3. 可信启动与远程证明:把度量、存储、报告、验证四步拆成能跑的命令
可信计算线上测试的第二大失分区是远程证明。题目往往给一段报文,问「验证方能不能通过」「失败原因是什么」。要答稳,必须知道 PCR 里装的是什么、quote 报文的每个字段来自哪里、验证方按顺序检查哪几项。这一章按启动度量的顺序往下走。
3.1 启动链上的度量点与 PCR 分配表
可信启动不是一次性把整个系统哈希一遍,而是沿着控制权转移的顺序逐段度量。每一段的度量结果进入约定的 PCR,最后聚合成一组「平台状态快照」。行业里通用的分配约定大致如下:
| PCR 索引 | 度量对象 | 说明 |
|---|---|---|
| 0 | 固件代码 | CRTM 与 BIOS/UEFI 主体 |
| 1 | 固件配置 | 固件的配置项与策略 |
| 2 | 扩展 ROM 代码 | 显卡、网卡等选件的固件 |
| 3 | 扩展 ROM 配置 | 选件的配置数据 |
| 4 | 引导管理器 | 引导加载程序及其配置 |
| 5 | 分区表 | GPT/MBR 结构 |
| 6 | 唤醒事件 | 电源状态切换相关事件 |
| 7 | 安全启动策略 | 平台安全启动的开关与密钥 |
| 8-15 | 操作系统 | 内核、initramfs、启动参数等 |
| 23 | 应用层 | 用户态完整性度量,如 IMA |
这张表不需要死记,但要理解分配逻辑:索引越小,度量发生得越早,可信级别越高。考卷上如果问「内核被篡改,最可能反映在哪个 PCR」,答案落在 8-15 区间;如果问「改了引导参数」,通常落在 PCR 8 或 PCR 9(取决于具体实现)。
需要提醒的是,不同平台的具体分配可能有差异,答题时如果题目给了平台说明,一定以题目为准。我见过不少人拿着通用表硬套,结果在一个明确写了「该平台将内核命令行度量到 PCR 12」的题上翻车。
3.2 远程证明的最小闭环:从 quote 请求到验签
远程证明的完整流程可以压缩成四步:验证方发 nonce;证明方用 AK 对「PCR 值 + nonce」签名;证明方把 quote 报文、签名、PCR 值、AK 证书一起发回;验证方验签、比对 PCR 与预期基线、检查 nonce 是否为自己发出的那一个。落到命令上:
# 证明方:生成 quote,-q 是验证方给的随机数,-l 指定要证明的 PCR 集合 tpm2_quote -c ak.ctx -l sha256:0,1,2,3,4,5,6,7 \ -q "a1b2c3d4e5f6" \ -m quote.msg -s quote.sig -o pcr.bin # 验证方:用 AK 公钥校验签名,并把报文里的 PCR 值与本地 pcr.bin 比对 tpm2_checkquote -u ak.pub -m quote.msg -s quote.sig \ -f pcr.bin -q "a1b2c3d4e5f6"参数含义值得逐条拆开:-c是已加载的 AK 上下文,-l决定这次证明覆盖哪些 PCR(覆盖范围越大,报文越大,验证方负担越重),-q是防重放的随机数,-m输出带 PCR 摘要的报文,-s输出签名,-o输出被签名的 PCR 原始值。验证端的-f必须喂入同一份 PCR 值,否则比对一定失败。
这里的设计意图是:签名只保证「这些 PCR 值确实是某把 AK 签的」,不保证「这些值是对的」。所以完整验证必须包含两件事——密码学校验(签名有效)和策略校验(PCR 值等于预期基线)。很多简答题就是考这一点:只验签不比对基线,等于什么都没验。
3.3 验签失败的四个高频原因
线上测试里的故障分析题,八成围绕验签失败。按排查顺序列一下真实环境里最常遇到的四种情况。
第一是 nonce 不一致。验证方每次挑战都生成新随机数,证明方如果复用了上一次的 quote 报文,nonce 对不上,验签直接失败。这类攻击叫重放,nonce 就是它的解药,答题时要把「新鲜性」这个词写出来。
第二是 AK 证书链断了。验证方拿到 AK 公钥后,要确认这把 AK 确实由某个可信 EK 签发、该 EK 又有厂商证书。如果只拿公钥验签、不验证书,中间人完全可以自己造一对密钥签一份漂亮的 quote 发过来。
第三是 PCR 索引不匹配。证明方按sha256:0-7出证,验证方却拿sha256:0-9的基线去比,长度都对不上。这类错误在联调阶段特别常见,本质是双方对「证明范围」没有事先约定。
第四是算法套件不一致。TPM 支持 SHA1、SHA256、SM3 等多种摘要,如果证明方用 SHA256 扩展、验证方按 SHA1 读 PCR,值永远不会相等。国内环境里还可能遇到国密算法与通用算法混用的情况,配置前必须对齐。
4. 线上测试的题型拆解:单选、判断、简答各自的失分点
知识点铺完,得回到卷面。可信计算线上测试的题型通常比较固定,但每一类都有特定的坑。这一章按题型讲答法,重点不是给答案,而是给「怎么推出答案」的路径。
4.1 概念辨析题:用一张对照表把易混项钉死
选择题和判断题的大头是概念辨析。下面这张表覆盖了历年高频的六组对比,建议自己默写一遍再对照:
| 易混项 | 核心区别 | 常见错误说法 |
|---|---|---|
| 度量与证明 | 度量是本地计算并记录哈希,证明是把记录远程报告出去 | 「度量就是把 PCR 发给服务器」 |
| 密封与绑定 | 密封绑定平台状态(PCR),绑定只绑定密钥层级 | 「密封的数据换个平台也能解」 |
| SRTM 与 DRTM | 前者依赖静态启动路径,后者用 late launch 重建 | 「DRTM 就是更快的 SRTM」 |
| TPM 与 TCM | 算法套件不同,信任模型基本一致 | 「TCM 是 TPM 的国产替代品,功能完全等价」 |
| 被动度量与主动度量 | 先记录后执行,还是先检查再执行 | 「主动度量就是度量得更快」 |
| EK 与 AK | 身份密钥与证明密钥,职责分离 | 「EK 可以直接签 quote」 |
辨析题的通用打法:先找题干里的动作词——是「记录」「签名」还是「解密」,动作定了,对应的密钥和机制基本就定了。很多题干的迷惑性来自把两个动作揉在一句话里,拆开看就清楚了。
4.2 计算与流程题:手推一遍哈希链
计算题一般考 PCR 扩展或者度量链的完整性判断。给一道典型题的解法:假设 PCR 0 初值为全零,依次扩展数据 A 和 B,求最终值。手推思路是分两步,第一步算H(0 || H(A)),第二步拿这个结果当旧值算H(第一步结果 || H(B))。考场上没有计算器做 SHA256,题目通常会给出中间哈希值,你只需要写对拼接顺序。
流程题则是给一段启动过程,让你排序或指出缺失环节。答题模板是「固件→引导管理器→内核→应用」,每一段问自己三个问题:谁度量它、结果进哪个 PCR、谁来验证。三个问题答全,流程题基本不会丢分。
还有一种变形题给一张 PCR 前后对比表,问「哪一段被篡改了」。判断依据是找第一个出现差异的 PCR 索引,差异点之前的部分可信,差异点之后全部不可信——因为信任链是逐级传递的,前一级被污染,后一级的度量值再正常也没有意义。这个「从最小索引开始找」的原则,是流程题的核心。
4.3 简答题:按「对象—动作—证据」三段式写
简答题最容易犯的错是写成一锅粥:把定义、流程、意义混在一起,阅卷人找不到得分点。我的习惯是强制三段式。
第一段写对象:这道题涉及哪个组件、哪个密钥、哪条链。第二段写动作:它对什么做了什么操作,输入输出分别是什么。第三段写证据:做完之后留下什么可验证的痕迹,谁来验证。
拿「简述远程证明过程」举例。对象段写「证明方持有 AK,验证方持有 AK 公钥与 PCR 基线」;动作段写「验证方发 nonce,证明方用 AK 对 PCR 与 nonce 签名并回传」;证据段写「验证方验签并比对基线,两者同时通过才判定平台可信」。三段各两三句话,得分点全在里面,而且不容易漏。
需要强调的是,简答题里「为什么」比「是什么」值钱。同样是写 nonce,写「加随机数防重放」比写「加一个随机数」多拿分,因为前者说明了设计意图。
4.4 判断题的陷阱句式
判断题的套路很固定,看到下面几种句式先警惕:出现「只要……就……」,大概率错,因为可信计算的每个环节都要求多重条件同时满足;出现「完全」「彻底」「绝对」,大概率错,安全领域很少有绝对;出现「先执行再度量」描述主动度量,错,顺序反了;出现「PCR 可以写入任意值」,错,只能扩展。
反过来,出现「依赖」「假设」「在……前提下」这类限定词的句子,正确率反而高,因为它们符合可信计算「信任是有条件传递」的基本设定。
5. 备考路上的四个翻车现场:从现象倒推原因
这一章是我自己踩过、也见别人踩过的坑,按「现象→原因→解决」写。可信计算这门的坑有个共同特点:概念听起来都对,一到具体场景就错位。
5.1 现象:PCR 编号背得滚瓜烂熟,题目一换平台就全错
原因在于把通用分配表当成了标准。PCR 0-7 的语义在 PC 客户端规范里有建议值,但具体平台完全可以在合规范围内调整,尤其是操作系统控制的 8-15 区间,不同发行版、不同引导方案的分配差异很大。题目如果给了平台说明,通用表就是干扰项。
解决办法是养成「先读题干里的平台约定」的习惯。做题时先把题目给的映射关系抄在草稿纸上,再往里套,别急着调用记忆。复习阶段可以把通用表当理解框架,但答题时必须以题为准。
5.2 现象:远程证明题写「验签通过即平台可信」,被判全错
原因是没有区分密码学有效性和策略符合性。签名通过只证明报文没被篡改、确实由持有 AK 私钥的一方发出,但完全可能存在「AK 合法、PCR 值异常」的情况——机器被入侵后重新度量,签名照样有效。验证方必须拿 PCR 值和预期基线逐项比对,这一步才是「可信」判定的实质。
解决办法是在答题时强制写出两个检查项,并说明两者缺一不可。同时补一句 AK 证书链的验证,三层都写到,这道题基本满分。
5.3 现象:把 EK 当成通用签名密钥,实验里怎么都签不出来
原因是对受限密钥的理解不到位。EK 在多数实现里是 restricted 密钥,只能做有限的解密操作(如激活凭证),不能任意签名;即使某些配置下允许签名,规范也明确不建议。实验里用 EK 直接 quote,会得到「密钥属性不允许该操作」一类的错误。
解决办法是严格按职责分工:EK 只负责身份证明和签发 AK 证书,AK 负责所有证明签名。建密钥时把模板参数看一遍,-G、-gs、属性位各管什么,心里有数就不会乱用。
5.4 现象:模拟器上跑通的命令,换到实机全部报权限错
原因是模拟器通常以单用户、全权限运行,而实机上的 TPM 资源有层级和授权限制。owner 层级、 endorsement 层级、lockout 层级各自的权限边界不同,某些操作需要先取授权会话,某些 PCR 在特定 locality 下才允许扩展。模拟器把这些都简化掉了,所以「本地能跑」不等于「实机能跑」。
解决办法是养成看返回码的习惯。TPM 的错误码会明确告诉你是授权失败、句柄无效还是属性不允许,对照规范查一下比盲试快得多。实机调试前先用tpm2_getcap把能力和属性查一遍,能省掉大量返工。
6. 从背题到讲得清:用一张自检表把整条链串起来
复习到后期,我判断自己有没有真懂,不用看刷了多少题,而是看能不能不看资料把下面这张表填满。填不出来的格子,就是还没打通的地方。
| 自检问题 | 能答上来意味着 |
|---|---|
| 第一个被执行的代码由谁度量 | 理解了 CRTM 的不可度量公理 |
| PCR 为什么只能扩展不能写 | 理解了哈希链的抗抵赖性 |
| EK 和 AK 分别解决什么问题 | 理解了职责分离的设计动机 |
| quote 报文里 nonce 防的是什么 | 理解了新鲜性与重放攻击 |
| 验签通过为什么还不等于可信 | 理解了密码学校验与策略校验的分工 |
| SRTM 的盲区在哪、DRTM 怎么补 | 理解了静态与动态信任根的边界 |
填表的过程中有个技巧:每答一格,强迫自己补一个具体例子。比如答「PCR 只能扩展」,就顺手写出H(old || H(data))的公式,并说清楚拼接顺序错了会怎样。能落到公式和命令上的理解,才是考场上写得出来的理解。
再往前一步,是能给别人讲。我给自己定的标准是:拿一张白纸,从「上电第一行代码」讲到「验证方判定平台可信」,中间不准跳步、不准用「然后就好了」这种话糊弄。第一次讲大概率会在 AK 证书链那里卡住,卡住的地方就是下次复习的重点。这个方法听起来笨,但比反复刷同一批选择题有效得多——选择题能靠排除法蒙对,讲给别人听蒙不了。
还有一个血泪经验:别把复习资料里的答案当终点。看到一道题的答案写「因为 PCR 值匹配」,要追问一句「匹配的是哪个 PCR、和谁的基线比、基线从哪来」。这三个追问答不上来,说明答案只是被记住,没有被理解。线上测试的题库会变,但追问的方向不会变。
最后留一个我自己的习惯:考前一周不再看新题,只把第 3 章那四条命令在模拟器上重跑一遍,跑完对着输出把每个参数念一遍。手上有过一遍的东西,考场上回忆起来的概率高得多。这套方法不神秘,就是把抽象概念反复按回具体的命令和公式上,直到它们变成条件反射。希望帮到你。
本文还有配套的精品资源,点击获取