📌 国密算法速览
在介绍 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)的通信加密系统。