首页 / 资讯中心 / 文章详情

密评考试密码基础刷题指南:从SM4/SM2/SM3到安全性评估

密评考试密码基础刷题指南:从SM4/SM2/SM3到安全性评估 ★ FEATURED ARTICLE
简介这份资源面向备考商用密码应用与安全性评估密评的考生及信息安全从业者以刷题形式帮助梳理密码基础与安全评估核心考点。内容覆盖分组密码工作模式、KDC密钥分发、PGP密钥体系、PKI组件与证书管理、SSL/TLS握手、IPSec协议、SM4算法结构、密钥分类与分发技术以及《密码法》相关法规等高频知识点题型以单选、多选为主并附答案与解析便于自测与查漏补缺。资源包共1个docx文档约26KB轻量易读适合碎片化刷题与考前集中复习。目前已有3237人学习下载可作为密评备考的辅助练习材料帮助读者快速定位薄弱环节、熟悉命题思路与常见陷阱提升应试效率。1. 密评考试里最容易被低估的其实是密码基础刷题方式很多人准备商用密码应用与安全性评估考试第一反应是去背标准条款、抄合规清单结果一上机做模拟题就发现题干里问的明明是 SM4 的分组长度、SM2 的签名流程、HMAC 的密钥长度自己却卡在“这到底考的是密码基础还是密评规范”上。密评考试题真正的难点不在法规记忆而在于它把密码基础和商用密码应用与安全性评估揉在一起考——同一道题前半句在问算法参数后半句就跳到密钥管理生命周期。如果你只是零散刷题、不建立知识映射正确率会一直卡在及格线附近晃。这篇文章面向三类人正在准备密评考试、想用刷题方式系统补密码基础的从业者已经做过等保或密码改造、但理论体系有漏洞的工程师以及想判断“刷题这条路值不值得投入时间”的技术负责人。我会把密码基础知识点、密评考试常见题型、刷题路径和参数记忆方法拆开讲让你能照着复现一套自己的刷题流程而不是盲目刷几千道题。2. 密评考试题到底在考什么从密码基础到安全性评估的映射2.1 密码基础在密评考试中的真实权重很多人以为密评考试就是考 GB/T 39786 和 GM/T 0054密码基础只是“顺带考一点”。实际做几套模拟题就会发现密码基础的占比远比想象中高。对称算法、非对称算法、杂凑算法、消息认证码、密钥交换、随机数生成——这些内容不是独立章节而是渗透在每一道应用场景题里。比如一道典型题干“某系统采用 SM4-CBC 模式对业务数据加密IV 由系统时间戳生成问该实现存在什么安全问题。”这道题表面在考密评规范里的“密码算法使用要求”实际考的是你懂不懂 CBC 模式下 IV 必须随机且不可预测。如果你密码基础不牢只能从合规条款硬套很容易选错。我一般把密评考试里的密码基础分成四个层次来准备层次内容在考试中的呈现方式算法参数分组长度、密钥长度、输出长度、轮数选择题直接问或藏在场景题里工作模式ECB/CBC/CTR/OFB/CFB/GCM给场景判断安全性密钥管理生成、分发、存储、更新、销毁案例题核心考点协议流程签名、验签、密钥交换、认证流程排序或缺陷分析这四个层次不是孤立的。考试喜欢在“密钥管理”场景里嵌入“算法参数”细节比如问“SM2 密钥对用于数字签名时私钥长度和签名结果长度分别是多少”。你如果只背了“SM2 是非对称算法”这题就没法选。2.2 商用密码应用与安全性评估的四个维度怎么落到题里商用密码应用与安全性评估的核心框架是四个维度机密性、完整性、真实性、不可否认性。考试不会直接问你“四个维度是什么”而是给一个业务场景让你判断当前密码应用方案是否覆盖了这四个维度。举个我刷到过的模拟题某政务系统使用 SM4 加密存储数据使用 SM3 做数据完整性校验但未使用任何数字签名机制。问该方案在四个维度上的覆盖情况。正确答案是机密性和完整性有覆盖真实性和不可否认性缺失。如果你不理解“真实性”和“不可否认性”分别对应什么密码技术这题就只能靠猜。这里的关键映射关系是机密性 → 对称加密SM4、非对称加密SM2完整性 → 杂凑算法SM3、消息认证码HMAC-SM3真实性 → 数字签名SM2、消息认证码不可否认性 → 数字签名SM2刷题时遇到场景题先在心里过一遍这四个维度再看题干里用了哪些密码技术缺了哪个维度正确率会明显提升。2.3 用 Python 快速验证密码基础知识点刷题时遇到记不准的参数最有效的方法不是反复背而是用代码跑一遍。Python 的gmssl库或者直接调用系统密码模块可以快速验证 SM3、SM4、SM2 的基本参数。# 用 Python 验证 SM3 杂凑算法的输出长度和基本特性 # 需要安装 gmssl 库pip install gmssl from gmssl import sm3, func def verify_sm3(): # SM3 输出固定 256 位即 32 字节 test_data b密评考试密码基础验证 # gmssl 的 sm3 需要传入列表形式的字节 data_list list(test_data) hash_hex sm3.sm3_hash(func.bytes_to_list(test_data)) print(f输入长度: {len(test_data)} 字节) print(fSM3 输出: {hash_hex}) print(f输出长度: {len(hash_hex)} 个十六进制字符 {len(hash_hex)//2} 字节) # 验证雪崩效应改一个字节输出应完全不同 test_data2 b密评考试密码基础验证! hash_hex2 sm3.sm3_hash(func.bytes_to_list(test_data2)) print(f修改后输出: {hash_hex2}) print(f是否完全不同: {hash_hex ! hash_hex2}) verify_sm3()这段代码做了三件事验证 SM3 输出长度是 32 字节、验证输入变化一个字节输出完全不同雪崩效应、确认 SM3 是确定性算法。刷题时遇到“SM3 输出长度是多少”“SM3 是否具有雪崩效应”这类题跑一遍代码比背十遍都管用。参数说明sm3.sm3_hash()接收的是字节列表返回 64 个十六进制字符。func.bytes_to_list()是 gmssl 库提供的转换函数。如果你本地没有 gmssl也可以用hashlib的sm3支持Python 3.11 部分环境支持或者用 OpenSSL 命令行验证。# 用 OpenSSL 验证 SM3需要 OpenSSL 1.1.1 以上版本 echo -n 密评考试密码基础验证 | openssl dgst -sm3 # 输出应为 64 个十六进制字符命令行方式更适合快速验证不需要装 Python 库。刷题时遇到不确定的杂凑值直接命令行跑一下比翻资料快得多。3. 刷题路径怎么设计从知识点到题感的四步法3.1 先建知识框架再刷题还是边刷边补这个问题我踩过坑。一开始我直接刷题刷了三百多道发现正确率一直在 60% 左右因为很多题考的是同一个知识点但换了场景我没总结出规律。后来改成先花两天把密码基础框架过一遍再刷题正确率直接上到 75% 以上。我的建议是先用半天时间建立最小知识框架然后边刷边补。最小框架不需要背细节只需要知道“有哪些算法、各自解决什么问题、关键参数是什么”。具体来说对称算法SM4分组 128 位、密钥 128 位、SM1硬件实现非对称算法SM2基于椭圆曲线密钥 256 位、SM9标识密码杂凑算法SM3输出 256 位工作模式ECB、CBC、CTR、OFB、CFB、GCM密钥管理生成、存储、分发、使用、更新、销毁密码协议SSL/TLS 国密改造、IPSec 国密改造这个框架建起来之后刷题时每道题都能归到某个格子里错题也能定位到具体知识点。3.2 按题型分类刷而不是按顺序刷密评考试题大致分四类参数记忆题、场景判断题、流程排序题、缺陷分析题。按顺序刷题的问题是同一类题分散在不同位置你很难形成题感。我一般按题型分类刷参数记忆题直接问算法参数比如“SM4 分组长度是多少”。这类题没有技巧就是记。但可以用对比表辅助记忆算法类型关键参数SM4对称分组分组 128 位密钥 128 位32 轮SM3杂凑输出 256 位分组 512 位SM2非对称密钥 256 位基于 256 位椭圆曲线SM9标识密码基于双线性对标识长度可变场景判断题给一个业务场景问密码应用是否合规。这类题的关键是抓住“四个维度”和“密钥管理”两条线。流程排序题给签名、验签、密钥交换的步骤让你排序。这类题需要理解协议流程不能死记。缺陷分析题给一段密码实现描述问存在什么安全问题。这类题最难需要同时懂算法、模式、密钥管理。3.3 用错题反查知识漏洞的具体操作错题不是抄一遍答案就完了。我一般对每道错题做三件事第一定位知识点。这道题考的是哪个算法、哪个模式、哪个管理环节。第二查标准或教材里的对应描述。第三用自己的话写一句“这道题为什么错”。比如“CBC 模式 IV 必须随机不能用时间戳因为时间戳可预测会导致相同明文产生相同密文”。# 用 Python 模拟 CBC 模式 IV 可预测导致的安全问题 # 演示相同明文 可预测 IV 相同密文 from gmssl.sm4 import CryptSM4, SM4_ENCRYPT def cbc_iv_demo(): key b0123456789abcdef # 16 字节密钥 crypt_sm4 CryptSM4() crypt_sm4.set_key(key, SM4_ENCRYPT) plaintext bAAAAAAAAAAAAAAAA # 16 字节明文 # 场景1IV 固定模拟可预测 IV iv_fixed b0000000000000000 cipher1 crypt_sm4.crypt_cbc(iv_fixed, plaintext) cipher2 crypt_sm4.crypt_cbc(iv_fixed, plaintext) print(f固定 IV 两次加密结果相同: {cipher1 cipher2}) # 场景2IV 随机 import os iv_random1 os.urandom(16) iv_random2 os.urandom(16) cipher3 crypt_sm4.crypt_cbc(iv_random1, plaintext) cipher4 crypt_sm4.crypt_cbc(iv_random2, plaintext) print(f随机 IV 两次加密结果相同: {cipher3 cipher4}) cbc_iv_demo()这段代码直观展示了为什么 CBC 模式的 IV 必须随机固定 IV 会导致相同明文产生相同密文攻击者可以通过观察密文判断明文是否重复。刷题时遇到“CBC 模式 IV 要求”的题跑一遍这个代码印象会非常深。参数说明crypt_cbc()第一个参数是 IV第二个参数是明文。SM4 的 CBC 模式要求 IV 长度为 16 字节。os.urandom(16)生成 16 字节随机数模拟安全随机 IV。3.4 模拟考试环境下的时间分配密评考试题量不小很多人做不完不是因为不会而是因为在一道题上纠结太久。我一般建议这样分配时间参数记忆题30 秒内必须作答不会就标记跳过场景判断题1 分钟内作答先判断四个维度覆盖情况流程排序题1.5 分钟内作答先找首尾步骤缺陷分析题2 分钟内作答先定位算法/模式/密钥管理哪个环节有问题刷题时用计时器模拟慢慢就能形成节奏。我一开始做缺陷分析题要花 4 分钟练了两周后能压到 2 分钟以内。4. 密码基础高频考点与刷题避坑4.1 SM4 工作模式ECB 为什么是考试里的“送分题”也是“送命题”ECB 模式在密评考试里出现频率极高因为它是最简单也最不安全的模式。考试喜欢问“以下哪种模式不适合加密业务数据”ECB 几乎是必选答案。但很多人只知道 ECB 不安全不知道为什么。ECB 的问题是相同明文块产生相同密文块。这意味着如果明文有重复结构密文也会暴露这种结构。经典的例子是加密图片时ECB 模式会保留图片的轮廓。# 演示 ECB 模式相同明文块产生相同密文块 from gmssl.sm4 import CryptSM4, SM4_ENCRYPT def ecb_pattern_demo(): key b0123456789abcdef crypt_sm4 CryptSM4() crypt_sm4.set_key(key, SM4_ENCRYPT) # 构造有重复块的明文两个相同的 16 字节块 block bAAAAAAAAAAAAAAAA plaintext block block # 32 字节两个相同块 cipher crypt_sm4.crypt_ecb(plaintext) # 密文前 16 字节和后 16 字节应该相同 first_block cipher[:16] second_block cipher[16:32] print(fECB 模式下两个相同明文块的密文是否相同: {first_block second_block}) print(f第一块密文: {first_block.hex()}) print(f第二块密文: {second_block.hex()}) ecb_pattern_demo()运行结果会显示两个密文块完全相同。这就是 ECB 模式的核心缺陷它把明文的结构暴露给了攻击者。刷题时遇到“ECB 模式安全性”的题记住这个演示答案就清楚了。参数说明crypt_ecb()直接接收明文不需要 IV。SM4 的 ECB 模式按 16 字节分组独立加密。如果明文长度不是 16 的整数倍需要填充。4.2 SM2 签名与验签流程题最容易丢分的三个细节SM2 签名流程是密评考试的高频考点但很多人丢分不是因为不懂原理而是忽略了三个细节第一签名结果包含两部分r 和 s。考试可能问“SM2 签名结果的长度是多少”正确答案是 64 字节r 和 s 各 32 字节不是 32 字节。第二验签时需要用到签名者的公钥和签名值以及原始消息的杂凑值。流程题里经常把“计算杂凑值”这一步放在签名之前还是之后来混淆。第三SM2 签名过程中使用了随机数 kk 必须每次签名都不同。如果 k 重复私钥可能被推导出来。这是缺陷分析题的常见考点。# 用 gmssl 演示 SM2 签名和验签的基本流程 from gmssl import sm2, func def sm2_sign_verify_demo(): # 生成密钥对实际使用中私钥应安全存储 private_key 00 1 * 63 # 示例私钥实际应随机生成 public_key 00 2 * 63 # 示例公钥实际应由私钥推导 sm2_crypt sm2.CryptSM2( public_keypublic_key, private_keyprivate_key ) message b密评考试SM2签名验证 # 签名 random_hex func.random_hex(sm2_crypt.para_len) sign sm2_crypt.sign(message, random_hex) print(f签名值长度: {len(sign)} 个十六进制字符 {len(sign)//2} 字节) print(f签名值: {sign}) # 验签 verify_result sm2_crypt.verify(sign, message) print(f验签结果: {verify_result}) sm2_sign_verify_demo()这段代码展示了 SM2 签名的基本流程和签名值长度。注意签名值长度是 128 个十六进制字符即 64 字节对应 r 和 s 各 32 字节。参数说明sm2.CryptSM2()需要传入公钥和私钥。sign()方法接收消息和随机数返回签名值。verify()方法接收签名值和消息返回布尔值。实际使用中私钥和随机数必须安全生成和存储。4.3 密钥管理生命周期案例题里最常挖的坑密钥管理是密评考试案例题的核心考点。考试喜欢给一个密钥管理流程让你找缺陷。常见的坑包括密钥生成使用弱随机数密钥分发通过明文通道密钥存储未加密密钥更新周期过长或过短密钥销毁不彻底我刷到过一道题某系统使用 SM4 加密数据密钥硬编码在代码里。问存在什么问题。答案是密钥硬编码导致密钥泄露风险极高且无法更新。这类题的关键是抓住“密钥生命周期”的每个环节逐一检查。4.4 刷题时最容易翻车的三个习惯第一个习惯只刷题不总结。刷一千道题不总结不如刷三百道题每道都搞懂。我一般每刷 50 道题就停下来把错题按知识点分类看看哪个知识点错得最多。第二个习惯忽略标准原文。很多题的答案直接来自标准条款刷题时遇到不确定的一定要翻标准原文。比如 GM/T 0054 里对密钥管理的要求原文表述和刷题软件里的解析可能有细微差别。第三个习惯不模拟考试环境。平时刷题不限时考试时做不完。我一般每周做一次限时模拟用手机计时逼自己在压力下做题。5. 密评考试刷题的常见问题与排查5.1 正确率卡在 60% 上不去先查这三个地方现象刷了很多题正确率一直在 60% 左右怎么刷都上不去。原因通常不是题刷得不够而是知识框架有漏洞。最常见的是密码基础参数记混、四个维度映射不清、密钥管理环节遗漏。解决停下来花半天时间把密码基础框架重新过一遍。重点检查 SM4/SM3/SM2 的关键参数是否记准四个维度分别对应哪些密码技术密钥管理六个环节是否都能说出要点。框架补上之后正确率会明显提升。5.2 场景判断题总是选错问题出在“过度推理”现象场景判断题经常在两个选项之间纠结最后选了错的。原因过度推理。考试题通常不会考太偏的场景答案往往来自标准条款的直接应用。如果你开始想“但是实际系统中可能……”就容易选错。解决做题时先问自己“这道题考的是哪个知识点”然后直接套用标准条款。不要加入太多实际工程中的例外情况。考试考的是标准不是工程实践。5.3 流程排序题记不住顺序用“首尾定位法”现象SM2 签名、验签、密钥交换的流程排序题总是记不住。原因试图记住每一步但步骤太多容易混。解决先记住首尾步骤。比如 SM2 签名流程第一步是计算杂凑值最后一步是输出签名值r, s。中间步骤即使记不全也能通过首尾排除错误选项。验签流程类似第一步是计算杂凑值最后一步是输出验签结果。5.4 缺陷分析题找不到问题点按“算法-模式-密钥”三层排查现象给一段密码实现描述找不到安全问题。原因没有系统的排查方法。解决按三层排查。第一层看算法选择是否正确该用 SM4 的地方用了 SM2。第二层看工作模式是否安全ECB 模式加密业务数据CBC 模式 IV 可预测。第三层看密钥管理是否合规密钥硬编码密钥未更新。三层过一遍大部分缺陷都能找到。5.5 刷题软件答案和标准原文不一致以哪个为准现象刷题软件给的答案和标准原文表述不一致。原因刷题软件可能简化了标准表述或者题目本身有歧义。解决以标准原文为准。遇到不一致的题翻标准原文确认。如果标准原文表述模糊以最保守的选项为准。考试时如果遇到类似题选最符合标准原文的选项。6. 把刷题变成可复用的知识体系我的错题本方法刷题到最后拼的不是刷了多少道而是错题有没有变成自己的知识。我自己的做法是维护一个错题本但不是抄题而是按知识点归类。每道错题只记三样东西知识点标签、错误原因、正确理解。比如“SM4-CBC-IV 可预测”这个标签下我记了“IV 必须随机不能用时间戳因为时间戳可预测会导致相同明文产生相同密文”。这个错题本我一般用 Markdown 维护按密码基础、工作模式、密钥管理、密码协议四个大类分。每周复习一次只看标签和错误原因不看原题。如果某个标签下的错误原因我已经能条件反射地说出来就标记为已掌握。进阶一点的做法是把错题本和代码验证结合起来。遇到记不准的参数或流程写一段短代码跑一遍把代码和输出贴在错题本里。比如 SM2 签名值长度我贴了那段 Python 代码的输出“签名值长度: 128 个十六进制字符 64 字节”之后再也没有记混过。还有一个技巧是“反向出题”。复习错题时不是重做原题而是自己根据知识点出一道新题。比如“SM4 分组长度是多少”这个知识点我出一道“SM4 加密 100 字节数据需要多少个分组”。能出题说明真的理解了不能出题说明还在背答案。最后说一个我自己的教训刷题不要贪多。我一开始每天刷 200 道刷完就忘。后来改成每天 50 道每道都搞懂效果反而更好。密评考试题的核心知识点就那么多刷透比刷多重要。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站