📌 国密算法速览
在介绍 Yakit 支持之前,先了解国密三大核心算法:
算法 | 类型 | 对标国际标准 | 用途 |
|---|---|---|---|
SM2 | 非对称(ECC) | RSA | 数字签名、密钥交换、身份认证 |
SM3 | 哈希摘要 | MD5/SHA | 数字签名、数据完整性验证 |
SM4 | 对称分组加密 | DES/AES | 数据加解密(分组密码) |
说明:SM1 算法不公开,仅以 IP 核形式存在于芯片中,软件层面无法支持;SM9 为标识密码算法(非对称,将用户标识作为公钥)。
🔴 Yaklang/CDSL 对国密算法的支持情况
算法 | 支持程度 | 说明 |
|---|---|---|
SM3 | ✅ 完全支持 | hash 模块内置 |
SM4 | ✅ 完全支持 | 多模式加解密(CBC/OFB/CTR/ECB) |
SM2 | ⚠️ 有限支持 | 社区版 RSA 接口未针对 SM2 优化,功能待完善 |
SM1 | ❌ 不支持 | 算法不公开,软件层无法实现 |
📦 SM3 使用方法
函数:codec.Sm3(data)
说明:对数据生成 SM3 哈希摘要(输出十六进制字符串)
Yaklang 示例:
data = "Hello, World!" sm3Hash = codec.Sm3(data) dump(sm3Hash) // 输出:9185dda7c380d3d7ac243c9e39d1d56850cfe5f7a3b2509e65c4e82e8c29bf6a
使用场景:
数据完整性校验(替代 MD5/SHA)
密码存储(数据库中存 SM3 摘要而非明文)
消息认证码(MAC)生成
数字签名中的摘要计算
📦 SM4 使用方法
SM4 是 Yaklang 支持最完整的国密算法,支持多种加密模式:
1. SM4-CBC 模式(最常用) key = "0123456789abcdef" // 16字节密钥 iv = "fedcba9876543210" // 16字节初始化向量 plaintext = "Hello, SM4!" // 加密 ciphertext = codec.SM4EncryptCBCWithPKCS7Padding(key, iv, plaintext) // 解密 decrypted = codec.SM4DecryptCBCWithPKCS7Padding(key, iv, ciphertext) 2. SM4-OFB 模式 key = "0123456789abcdef" iv = "fedcba9876543210" ciphertext = codec.SM4EncryptOFBWithPKCSPadding(key, iv, plaintext) decrypted = codec.SM4DecryptOFBWithPKCSPadding(key, iv, ciphertext) 3. SM4-ECB 模式(简单但安全性较低) key = "0123456789abcdef" ciphertext = codec.SM4EncryptECBWithPKCSPadding(key, plaintext) decrypted = codec.SM4DecryptECBWithPKCSPadding(key, ciphertext) 4. SM4-CTR 模式 key = "0123456789abcdef" nonce = "fedcba9876543210" // 12字节nonce ciphertext = codec.SM4EncryptCTRWithPKCSPadding(key, nonce, plaintext) decrypted = codec.SM4DecryptCTRWithPKCSPadding(key, nonce, ciphertext)SM4 密钥格式注意事项:
密钥长度为 16 字节(128位)
Yakit 支持十六进制(Hex)格式密钥
CBC/OFB 模式需提供 16 字节 IV
CTR 模式需提供 12 字节 Nonce
⚠️ SM2 支持情况
项目 | 说明 |
|---|---|
当前状态 | 社区版功能有限,RSA 接口未针对 SM2 优化 |
原因 | 社区版开发优先级考量,暂无强烈硬需求 |
对标 | SM2 对标 RSA(数字签名/密钥交换) |
建议 | 如需完整的 SM2 支持,可通过 Yaklang 编写插件调用底层密码库 |
💡 如果需要 SM2 加解密/签名验签,可通过 Yaklang 热加载插件扩展,调用 sm-crypto 或 gm-crypto 等 JS 库实现。
🛠️ 在 Yakit GUI 中使用国密
场景一:Web Fuzzer 热加载中使用 SM4
在测试需要 SM4 加密的接口时,通过热加载标签动态生成加密 payload:
// 热加载函数示例 sm4Encrypt = func(p) { key = "0123456789abcdef" iv = "fedcba9876543210" // 对 fuzztag 生成的原始数据加密后发送 return codec.SM4EncryptCBCWithPKCS7Padding(key, iv, p) }场景二:编解码模块直接使用
在 Yakit 的 Codec(数据处理) 模块中:
选择编解码类型为 SM4
输入密钥和 IV
选择加密模式(CBC/OFB/CTR/ECB)
一键加解密
场景三:CTF / 渗透测试靶场
前端 SM4 加密通信分析
渗透测试中绕过前端加密(如金融类 App)
配合 Web Fuzzer 爆破带国密保护的接口
📊 核心函数汇总
函数 | 模式 | 填充 |
|---|---|---|
codec.Sm3(data) | — | — |
codec.SM4EncryptCBCWithPKCS7Padding | CBC | PKCS#7 |
codec.SM4DecryptCBCWithPKCS7Padding | CBC | PKCS#7 |
codec.SM4EncryptOFBWithPKCSPadding | OFB | PKCS#7 |
codec.SM4DecryptOFBWithPKCSPadding | OFB | PKCS#7 |
codec.SM4EncryptECBWithPKCSPadding | ECB | PKCS#7 |
codec.SM4DecryptECBWithPKCSPadding | ECB | PKCS#7 |
codec.SM4EncryptCTRWithPKCSPadding | CTR | PKCS#7 |
codec.SM4DecryptCTRWithPKCSPadding | CTR | PKCS#7 |
🎯 典型使用场景
场景 | 推荐算法 | 说明 |
|---|---|---|
测试国密 HTTPS 通信 | SM4 | 分析 SM4 加密的请求体/响应体 |
绕过前端 SM4 加密 | SM4-CBC/OFB | 热加载动态加密 payload |
数据完整性校验 | SM3 | 替代 SHA/MD5 验证响应签名 |
金融/政务系统渗透 | SM4 + SM3 | 国密标准系统测试 |
CTF 密码学题目 | SM4 | SM4 加解密类题目 |
总结:Yaklang 目前对 SM3 和 SM4 支持完整,可直接使用 codec 模块进行加解密和摘要计算;SM2 支持较为有限;SM1 不支持。在实际渗透测试中,SM4 是最常用的国密加解密算法,主要用于测试采用国密标准(金融、政务、移动 App)的通信加密系统。