问题修复
在测试密码学实现时,用 Wycheproof…
验证 AES、RSA、ECDSA、ECDH 等密码学实现是否通过已知攻击向量和边缘用例测试。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在测试密码学实现时,用 Wychepro通用
解决思路
- 将 Wycheproof 添加为 git submodule:执行 `git submodule add https://github.com/C2SP/wycheproof.git`,以确保测试向量自动更新。
- 无法使用 submodule 时,编写脚本从 `https://raw.githubusercontent.com/C2SP/wycheproof/master/testvectors_v1/` 下载所需 JSON 测试向量到 `.wycheproof/`,并在下载失败时退出。
- 优先使用 `testvectors_v1` 中的测试向量,而非 `testvectors`,因为前者信息更详细,推荐用于新集成。
- 根据算法选择文件:AES-GCM 用 `aes_gcm_test.json`,AES-EAX 用 `aes_eax_test.json`,ChaCha20-Poly1305 用 `chacha20_poly1305_test.json`,ECDSA 用 `ecdsa_*_test.json`,ECDH 用 `ecdh_*_test.json`,RSA 签名用 `rsa_*_test.json`。
- 解析 JSON:读取 `testGroups`,遍历每个组的 `tests`。
- 按实现约束过滤测试组,例如 `ivSize`、`keySize`、曲线等。
- 将十六进制字符串属性转换为字节:`key`、`aad`、`iv`、`msg`、`ct`、`tag`。
- 在 JavaScript 等环境中,将测试组共享属性(如 `publicKey.pk`)复制到每个测试对象。
- 编写参数化测试,每个 `tcId` 生成一个用例,用 `comment` 作为失败信息。
- 处理三种 `result`:`valid` 应成功,`invalid` 应失败,`acceptable` 可成功但含非理想属性。
- 加密测试:异常时断言 `result != 'valid'`;成功且 `valid` 时验证 `ct` 和 `tag`;`invalid` 或 `acceptable` 时断言输出不等于预期。
- 解密测试:异常时断言 `result != 'valid'`;无效标签时检查 `flags` 含 `ModifiedTag`;成功且 `valid` 时验证 `msg`。
- 签名验证测试:`valid` 时断言验证通过;`invalid` 时断言验证失败或点无法解码。
- 对加密/解密、签名/验证两个方向都编写测试,确保双向正确。
- 检查 `flags` 和 `notes` 字段,理解具体漏洞模式。
- 对 EdDSA 签名添加长度检查:必须正好 64 字节(128 个十六进制字符),拒绝尾部零。
- 对 ECDSA DER 编码检查:拒绝 r/s 第一个比特非 0,拒绝 DER 长度字段前导零。
- CI 集成:运行测试前更新 submodule 或执行下载脚本。
- 设置每周/每月计划更新测试向量,捕获新漏洞模式。
- 将 `acceptable` 结果视为需要调查的警告,不要忽略。
- 不要只测试 `valid`;测试所有 `valid`、`invalid`、`acceptable`。
- 不要忽略测试组过滤;按 `keySize`、`ivSize` 等过滤不支持的参数。
- 不要只测试一个方向;加密/签名可能工作,但解密/验证可能失败。
- 使用 `schemas` 文件夹中的 JSON schema 验证测试向量文件。
- 参考 pycryptodome 等库的最佳实践,集成 Wycheproof 测试向量。
- 测试失败时分析根因:检查实现代码,添加验证检查,提出修复。
- 案例研究方法:识别支持的曲线,找到对应测试向量,解析,写 harness,运行,识别失败,分析根因,修复。
- 使用覆盖率分析确保测试向量覆盖所有代码路径。
- 使用属性测试测试数学属性(如加密/解密往返)。
- 使用 constant-time testing 补充时序侧信道测试。
- 使用 cryptofuzz 等模糊测试补充 Wycheproof。
- 使用 fuzz harness 为密码学解析器创建测试。
- 了解共享字段:`tcId`、`comment`、`flags`、`result`。
- 了解算法特有字段:AES-GCM 的 `key`、`iv`、`aad`、`msg`、`ct`、`tag`;ECDH secp256k1 的 `public`、`private`、`shared`;ECDSA 的 `msg`、`sig`、`result`;EdDSA 的 `msg`、`sig`、`pk`。
- 使用 Wycheproof 检测常见漏洞:签名可延展性、无效 DER 编码、无效曲线攻击、填充 oracle、标签伪造。
- 查看 `header` 字段获取测试向量详细描述。
- 查看 `java` 和 `javascript` 文件夹中的参考 harness 作为实现参考。
适用边界 · 注意事项
- 测试时序侧信道时不适用;应使用 constant-time testing 工具。
- 发现新的未知 bug 时不适用;应使用 fuzzing。
- 测试自定义/实验性密码算法时不适用;Wycheproof 只覆盖已确立的算法。