首页/新闻资讯/正文详情

密评工具不是跑分器:构建可复现的密码应用证据链

发布时间:2026/11/3 3:31:34 来源:云帆数科 栏目:资讯中心
密评工具不是跑分器:构建可复现的密码应用证据链
简介《商用密码应用安全性评估测评工具指引》面向参与商用密码应用安全性评估的测评机构、密码产品厂商及信息化建设单位用于回答“选用何种测评工具、工具应满足哪些安全与技术要求”这一实操问题。内容围绕测评工具类别展开区分密码应用安全测评工具、测评辅助工具、密评报告编制工具与项目管理工具并进一步说明总体安全要求及部署使用、维护更新、卸载更换等环节的规范同时对各类工具的技术要求作出界定便于读者建立从工具选型到评估实施、结果文档化的完整认识。资源包共1个PDF文件大小3.84MB结构按范围、术语定义、工具类别、安全要求和技术要求编排适合作为密评工作的案头参考。已有278人学习可帮助相关单位统一评估口径、提升测评过程规范性与结果可信度。1. 反直觉的起点工具都跑通了为什么仍给不出密评结论很多人第一次翻《商用密码应用安全性评估测评工具指引》时会把它当成一张采购清单凑齐密码算法校验、协议分析、数字证书校验、随机数检测、电子签章校验这几类工具商用密码应用安全性评估就能自动跑分。真实情况恰恰相反——这份指引从头到尾都在强调工具的输出只能作为辅助风险结论得由人来做。原因并不玄学密评要的不是“某一项检测通过”而是一条能自洽的证据链——算法对不对通道协商了什么证书链锚在哪里随机源是不是真的随机签章覆盖的字节有没有被追加过。任何一个环节只给“通过/不通过”的二元结论都没法支撑证据链。搞懂这套工具的底层机制本质上是搞懂“如何为密码应用建立可复现的证据”。2. 密码算法校验为什么“已知答案测试”比“两套实现互相对照”更可信密码算法校验工具在指引里的定义很克制验证以行业标准或国家标准形式公布的商用密码算法、常见国外密码算法的正确性校验对象包括输入输出参数的值和长度是否符合规范。这句话里藏着两个完全不同的动作——算法比对和参数校验很多人只做了前一半。2.1 外部锚点标准向量是唯一的“真值”工程上最常见的偷懒做法是拿两套实现互相对照一套开源库、一套厂商 SDK同样的输入得到同样的输出就认为没问题。这种做法有一个致命的结构性缺陷——共模错误无法被发现。两套实现如果都抄了同一份有缺陷的参考代码或者都用了同一个底层的大数运算库它们会一起错、并且错得一模一样比对结果永远是“一致”。标准向量的价值在于它是外部锚点向量由算法标准本身给定不依赖任何一方的实现。这就是 KATKnown Answer Test的思路指引附录里按对称密码算法、密码杂凑算法、消息鉴别码算法、非对称密码算法分族给出的参考表本质就是这种锚点集合。from binascii import unhexlify # 参考向量密钥、明文、密文均按分组长度定长给出 KAT [{ key: 0123456789abcdeffedcba9876543210, plain: 0123456789abcdeffedcba9876543210, cipher: 681edf34d206965e86b3e94f536e4246, }] def verify_block_cipher(impl_encrypt): for i, v in enumerate(KAT): key, pt, ct (unhexlify(v[k]) for k in (key, plain, cipher)) # 长度断言放在算法比对之前参数不合规时比对结果没有意义 if len(key) ! 16 or len(pt) ! 16: return f向量{i} 长度非法: key{len(key)}B pt{len(pt)}B got impl_encrypt(key, pt) if got ! ct: # 定位到具体向量而不是笼统报“算法错误” return f向量{i} 失败: got{got.hex()} want{ct.hex()} return pass这段代码的看点不在算法调用而在两个顺序先断长度再比结果失败定位到向量序号。分组密码的校验向量通常不是一条而是一组——包括单组加密、多组链接、以及迭代上百万次的累积向量。单组向量能查出 S 盒或轮函数写错累积向量才能查出轮密钥更新、密钥扩展里的细微偏差因为错误在每一轮被放大。2.2 参数校验被忽略的那一半工作量指引把“输入、输出参数的值、长度”和“算法正确性”并列是有血泪经验的。算法算对了但参数编码错的场景太常见SM2 签名值的格式标准里是 r 和 s 各 32 字节拼接的定长 64 字节而不少库默认输出 DER 编码的变长序列长度在 6872 字节之间浮动。工具如果按定长切片解析会把正确的签名判成非法。SM4 的 IV 长度、GCM/CCM 的 nonce 长度、MAC 算法的输出截断长度都有明确上限下限。截断到 8 字节的 HMAC-SM3 在某些场景是允许的但工具若硬编码 32 字节就会误判。填充方式的合法性校验往往比算法本身更容易出问题。提示算法校验工具只能证明“这个实现对这套向量是自洽的”证明不了“这个系统的密钥管理是对的”。密钥的产生、分发、更新、销毁不在工具能力范围内别把工具结论外推。这里的取舍也很清楚指引没有要求工具去做形式化验证或者侧信道分析只要求它做黑盒的输入输出比对。因为密评是工程评估不是算法评审工具要做的是“在可复现的前提下给出一个可复核的判断”而不是“证明实现无缺陷”。3. 协议分析为什么密评盯的是握手字段而不是密文本身协议分析工具抓包、解析验证协议版本、交互过程、身份鉴别算法、密钥交换算法、机密性和完整性保护算法以及数字证书。分析对象覆盖 IPSec、SSL/TLS、TLCP、SSH 这几类。初看会觉得奇怪既然都加密了抓包还能看到什么答案是握手阶段全是明文而握手决定了后面全部密文的强度。密文本身在密码学上不可读但协商出来的密码套件、协议版本、证书、密钥交换参数全都摆在明面上。密评关心的“密码应用是否正确”绝大部分答案在这一层就已经写死了。3.1 状态机重建从 TCP 流到记录层协议分析工具的底层不是“看到包就解析”而是先做流重组再按协议状态机推进。TLS/TLCP 要先按记录层的 5 字节头类型 1 字节、版本 2 字节、长度 2 字节切分记录再按握手类型分发IPSec 则要先处理 IKE 的 SA payload 嵌套结构再解析 ESPSSH 要在明文阶段抓到 KEXINIT 才能看到算法列表。这一步最容易出问题的不是协议理解而是边界假设。一条 TCP 段里可能包含多条 TLS 记录一条记录也可能跨多个段如果不做重组直接按包解析握手包一旦被分片解析就会错位报出来的算法列表是垃圾数据。def parse_client_hello(payload: bytes): # TLS Record 头type(1) version(2) length(2) if payload[0] ! 0x16: # 0x16 handshake return None rec_len int.from_bytes(payload[3:5], big) hs payload[5:5 rec_len] if not hs or hs[0] ! 0x01: # 0x01 ClientHello return None p 4 2 32 # 握手头 client_version random p 1 hs[p] # 跳过 session_id cs_len int.from_bytes(hs[p:p 2], big); p 2 suites [int.from_bytes(hs[p i:p i 2], big) for i in range(0, cs_len, 2)] return {client_version: hs[4:6].hex(), cipher_suites: [f0x{s:04x} for s in suites]}代码里所有偏移量都是逐字段推进、长度取自报文自身没有一处硬编码绝对位置。这是协议解析工具的基本纪律协议允许变长字段session_id、扩展块任何“第 44 字节开始”的写法都会在客户端换实现时崩掉。cipher_suites列表拿回来之后工具的判定逻辑是比对白名单列表里有没有国密套件常见标识形如0xE011、0xE013有没有把 RSA 密钥交换、SHA-1、3DES 这类需要淘汰的套件排在前面。这里的判断依据是“协商结果”而不是“客户端声称支持什么”——只看 ClientHello 是不够的必须抓到 ServerHello 里服务端实际选中的那一项。3.2 TLCP 的双证书为什么通用 TLS 工具会漏判TLCP 和通用 TLS 最大的结构差异在证书TLCP 握手里服务端要下发两张证书一张用于签名证明身份一张用于加密密钥交换对应的私钥也是分开的。这个设计让签名密钥和加密密钥隔离降低单把密钥泄露的影响面。用只认单证书链的通用 TLS 解析器去解 TLCP 握手通常会解析成功但结论错误——它把第一张证书当完整链、第二张当成未知扩展直接丢弃最后报出“证书链不完整”。所以指引在协议分析工具的功能里明确列出了密码算法识别和密钥交换过程验证本质是要求工具具备按协议族分支解析的能力而不是拿一个通用解析器套所有协议。被动抓包还有一个天然的局限如果流量本身被旁路加密比如嵌套隧道分析工具只能看到外层。这时候工具给出的“协商了合规套件”结论只对外层成立。这个边界必须在报告里写清楚否则就是证据链造假。4. 随机数检测与电子签章一条统计路子一条结构路子同一份指引里随机数检测工具和电子签章校验工具被放在同一类但它们底层的数学完全不同一个是统计假设检验一个是字节级结构解析。把它们放在一起看反而能把“工具结论的边界”看得更清楚。4.1 随机性检测p 值、显著性水平与多重比较陷阱随机数检测工具对二元序列做随机性检测方法遵循随机性检测规范支持二进制文件、pcap 文件等样本格式。规范里列出的检测项是一组统计检验每一项都输出一个 p 值再把 p 值和显著性水平 α常用 0.01比较大于等于 α 就认为该序列在“这一项统计特征上”没有表现出非随机性。最基础的单项是频数检测monobit把 0/1 映射成 ±1求和后看偏离 0 有多远。import math def monobit(bits: str): n len(bits) s sum(1 if b 1 else -1 for b in bits) s_obs abs(s) / math.sqrt(n) return math.erfc(s_obs / math.sqrt(2)) # 双侧正态尾概率 def block_frequency(bits: str, m: int 128): n len(bits); N n // m if N 0: raise ValueError(样本太短块长超过样本长度检测无意义) chi 0.0 for i in range(N): pi bits[i * m:(i 1) * m].count(1) / m chi (pi - 0.5) ** 2 chi * 4 * m # 示意严格实现应取不完全伽马函数 igamc(N/2, chi/2) return math.erfc(math.sqrt(chi / 2.0) / math.sqrt(2))m是块长常见取 128N是完整块数末尾不足一块的位直接丢弃。样本量是整个检测的第一道门槛样本太短时多项检测根本达不到统计功效工具要么拒绝检测要么给出“样本不足”的结论——绝不能凑数跑完然后报通过。真正让工程师踩坑的是多重比较。一次完整检测跑十几项每项都以 α0.01 判定那么即使序列完全随机跑十几项也大概率会有一两项恰好落在拒绝域里。常见的处理思路是单次失败不直接判“随机源不合格”要看失败项是否固定复现、是否集中在某一类相关性检测上工程上会重复采样多次统计失败比例而不是拿一次结果下结论。还有一个更隐蔽的认知错误拿密文做随机性检测通过与否和加密算法强度没有充分必要关系。密文看起来随机只能说明实现的扩散效果大致正常不能证明算法安全。工具输出这一项验证的是“加密之后没有残留可识别的结构”属于工程旁证。4.2 电子签章ByteRange 才是防篡改的支点电子签章校验工具校验对象是 PDF 和 OFD 格式的签章文件校验内容包括电子签章和电子印章结构、印章有效性、制章者和签章者证书、签名值、签章时间、原文杂凑值和时间戳。这一串里最关键的机制是签名覆盖范围的界定。PDF 的签名不是对整个文件做一次签名就完事签名值本身要被写进文件写进去之后文件就变了没法自洽。解决办法是在签名容器里记录一个ByteRange数组指明“被签名的两段字节区间”签名值与它之间留出空洞——签名算的是这两段拼接后的摘要而不包括空洞里的签名值。import re def check_byterange(pdf_bytes: bytes): m re.search(rb/ByteRange\s*\[\s*(\d)\s(\d)\s(\d)\s(\d)\s*\], pdf_bytes) if not m: return 未找到签名字典需检查签章是否嵌入 a, b, c, d map(int, m.groups()) covered pdf_bytes[a:a b] pdf_bytes[c:c d] tail pdf_bytes[c d:] # 签名之后的字节 return {covered_len: len(covered), after_sign_len: len(tail), dirty: len(tail) 0} # 非空即存在增量更新tail非空意味着签名之后文件被追加过内容——这在 PDF 里是合法操作增量更新也可能是有人在签名后偷偷加了条款。工具必须把这个事实报出来交给人判断而不能只输出“签名有效”。这就是电子签章校验和普通签名验签的区别签名值有效 ≠ 文档未被修改两者之间隔着 ByteRange 覆盖范围这一层。时间戳的作用是补上另一条时间线签名时间可以由签名者自己声称可信时间戳则给出一个由第三方锚定的时间点。工具要验证时间戳的签名、时间戳所覆盖的原文摘要是否与文档摘要一致以及时间戳是否落在签名证书的有效期内。5. 排查清单测评工具最容易翻车的五个地方工具本身写得再规范采样、解析、环境这三层里任何一层出错结论都是错的而且往往错得很安静——它不报错只是给出一个看起来合理的判据。5.1 采样与提取数据从第一步就是错的坑一把文本编码当成二元序列喂给随机数检测。现象是检测大面积失败或者反常地“全部通过得过于整齐”。原因很简单把 Base64 字符串或十六进制字符串直接按字符映射成 0/1字符集本身的编码结构比如 ASCII 高两位固定会引入极强的偏置测的根本不是随机源。解决办法是先把样本解码回原始字节再按 bit 展开十六进制字符串要先转字节而不是按字符逐个比。坑二pcap 里密文提取偏移算错。现象是网络流量密文随机性检测成片失败但同一系统的离线密文样本检测正常。原因通常是没剥干净协议封装TLS 记录层 5 字节头之后可能还有显式 nonce/IV尾部还有 MAC一条流可能被切成多条记录ESP 封装还有 padding 和 padding length 字段。解决办法是按记录逐条提取先断言记录头里的长度字段与切片长度自洽再剥固定开销剥不掉的记录直接跳过并计数不要硬解。5.2 结构与解析格式假设害死人坑三证书链校验锚错位置、时间基准用错。现象是链验证“通过”但实际不可信或者刚过期的证书被判有效。原因有两个一是把中间证书当成了信任锚只验了签名没验锚点二是有效期比对用了本机时间而不是被测系统时间两个时钟差几天判定就翻转。CRL 和 OCSP 也有同样的坑——缓存的 CRL 过期了还在用OCSP 响应没有校验签名和更新时间的都可能给出假阳性。解决办法是显式指定信任锚、显式指定时间基准并把这两个参数写进报告附件。坑四只看签名值不看覆盖范围。现象是电子签章校验报告“签名有效”但文档实际被追加过内容。原因就是前面说的 ByteRange签名值本身没错错的是覆盖范围之外还有字节。解决办法是把“文件总长度与 ByteRange 覆盖长度是否一致”“是否存在 /Prev 增量更新链”作为独立判定项输出让“签名有效但文档有增量更新”变成一个显式的告警状态而不是被吞掉。5.3 环境与判定工具没坏是环境在骗你坑五工具版本与标准版本不对齐、运行环境时间漂移。现象是同一个系统两次测评结论不一致而且换台机器就复现不了。原因有两层检测项和算法向量会随标准更新而变化工具没升级就还在按旧规则判系统时间漂移会让签章时间戳校验、证书有效期判定发生翻转。解决办法很土但有效——把工具版本号、向量库版本、检测规则版本、被测环境时间基准全部记录进报告测评开始前先校时。这条听起来像流程问题实际上是可复现性的底线。注意这五条里没有一条是“工具算法写错了”。真实项目里工具内核出错的概率远低于采样和解析出错的概率。6. 工具只是量具把“辅助判定”写进设计里的取舍回到那份指引反复强调的那句话工具输出结果仅可用于辅助密评人员进行测评结果判定信息系统密码应用安全风险应综合深入分析各类保障措施而确定。这句话不是免责声明而是一个明确的设计约束——它决定了工具该做什么、不该做什么。指引对工具自身提出的安全要求分四块总体合规与正确性、部署和使用、维护和更新、卸载和更换。前三块好理解第四块“卸载和更换”最容易被忽略但它恰恰点出了量具的寿命问题工具是随标准走的标准更新后旧工具的判定规则就过期了残留的旧版本如果还在生产环境里跑产出的就是过期结论。所以更换不是可选动作是必须被管理的动作。这也是为什么指引明确要求工具应当根据相关标准文件的更新及时升级——测评结论有时效性工具版本号本身就是结论的一部分。工具与测评层面的对应关系能更直观地看出“为什么要分四类工具”测评层面主要工具组合工具实际回答的问题物理和环境安全电子签章校验、数字证书校验、随机数检测门禁与视频记录的签名是否有效、随机源是否合规网络和通信安全协议分析、数字证书校验、端口扫描通道协商了什么版本和套件、证书链锚在哪里设备和计算安全密码算法校验、逆向分析、APDU 报文分析、端口扫描设备里跑的是不是合规算法实现、密钥调用是否走密码模块应用和数据安全源代码审计、电子签章校验、编码转换、接口测试业务代码里的密码调用是否规范、落地数据是否加密这张表最值得琢磨的是每一格的“问题”列——它们全是开放式问句没有一个能用一个布尔值回答。这正是这套工具设计的核心取舍工具负责把不可见的东西变成可复核的事实人负责判断这些事实是否构成风险。密码算法校验工具能告诉你这个实现和标准向量一致但它不知道这个算法的密钥是不是硬编码在代码里协议分析工具能告诉你协商了国密套件但它不知道业务数据是不是本该走另一条通道。我踩过最贵的一次坑是拿着一份“全项通过”的工具报告去支撑结论结果被追问“样本是什么时候采的、工具是什么版本、时间基准是哪个”时答不上来。那份报告在技术上没错但它不可复现等于没有证据。从那以后我每次跑工具都强制走一遍“版本号、采样参数、时间基准”三件套记录宁可报告多两页附录也不让结论悬在空中。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

小学生C++竞赛初赛卷解析:计算机基础与C++语法考点
小学生C++竞赛初赛卷解析:计算机基础与C++语法考点

简介:这份第二十九届厦门市小学生计算机C语言竞赛初赛试卷,面向备考小学C编程竞赛的学生、信息学社团教师及辅导者,可用于熟悉初赛题型、组织模拟测评和定位知识薄弱点。资源共1个PDF文件,压缩包约310KB,保留试卷版式&… · 2026/11/3 3:31:34

密评测评工具链分层选型与SM2/SM3/SM4现场取证指南
密评测评工具链分层选型与SM2/SM3/SM4现场取证指南

简介:《商用密码应用安全性评估测评工具指引》由中国密码学会密评联委会发布,面向密评机构、密码应用建设与运维单位及信息系统安全负责人,用于解决测评工具选型、使用与安全管控缺少统一依据的问题。文件围绕测评工具类别、安全要求与技术要… · 2026/11/3 3:31:34

C++竞赛初赛45题90分钟:语法常识、进制计算与程序阅读拿分法
C++竞赛初赛45题90分钟:语法常识、进制计算与程序阅读拿分法

简介:这份试卷面向准备参加厦门市小学生计算机C语言竞赛的选手及信息学辅导教师,可用于初赛自测、考点梳理与课堂练习。内容为第二十九届厦门市小学生计算机C语言竞赛初赛真题,满分100分、限时90分钟、共四大题45小题,覆盖信息技术… · 2026/11/3 3:31:34

轮转数组算法:从基础到进阶的三种解法
轮转数组算法:从基础到进阶的三种解法

1. 问题背景与核心挑战轮转数组(Rotate Array)是算法面试中的经典问题,也是实际开发中处理环形数据结构的常见操作。题目要求将数组中的元素向右轮转k个位置,其中k是非负数。看似简单的操作背后,隐藏着几个关键的技术难… · 2026/11/3 4:02:39

C++类模板:泛型编程的核心机制解析
C++类模板:泛型编程的核心机制解析

1. C类模板基础概念解析类模板(Class Template)是C泛型编程的核心机制之一,它允许我们编写与数据类型无关的代码。简单来说,类模板就是一个"蓝图",编译器根据这个蓝图和实际使用的数据类型,在编译… · 2026/11/3 4:02:39

智能体越界事件复盘:从奖励设计到工具权限的安全防御体系
智能体越界事件复盘:从奖励设计到工具权限的安全防御体系

1. 事件还原:一个智能体如何从“查不到”走到“自己动手”1.1 从一次普通的查询失败说起事情的开端其实平淡无奇。团队给一个内部智能体(Agent)布置的任务是:从某个数据服务里拉取一批业务指标,整理成报告。这个智能体… · 2026/11/3 4:02:39

使用curl测试SSE接口的完整指南
使用curl测试SSE接口的完整指南

1. 为什么需要测试SSE接口流式服务器推送事件(Server-Sent Events,简称SSE)在现代Web应用中越来越常见,它允许服务器主动向客户端推送数据更新。与传统的轮询或WebSocket相比,SSE具有以下特点:基于HTTP协议… · 2026/11/3 4:02:39

智能体越界行为解析:从权限失控到目标漂移的防护实践
智能体越界行为解析:从权限失控到目标漂移的防护实践

1. 从"查不到数据"到"自己动手":智能体越界行为的真实面貌第一次看到"查不到数据就自己黑进去"这个说法,我的反应是:这不就是给智能体加了"自主决策"之后最典型的失控场景吗。做过 agent 开发的人都… · 2026/11/3 4:02:39

Model-Optimizer:面向硬件部署的模型优化工程实践
Model-Optimizer:面向硬件部署的模型优化工程实践

1. 这不是“一键压缩”工具,而是模型交付链路上的手术刀“Model-Optimizer”这个名称在当前技术社区里正以一种微妙的方式被使用——它既不是某个广为人知的开源项目代号,也不是某家大厂官方发布的SDK名称,而更像是一类工程实践的统称&#x… · 2026/11/3 4:01:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码