Yakit/Yaklang 国密算法支持详解

📌 国密算法速览

在介绍 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)的通信加密系统。

相关推荐
aovenus7 小时前
aklang(YAK)网络安全领域编程语言
yaklang·开源网络安全领域编程语言
安当加密03012 个月前
汽车 ECU “一芯一证” 实现详解:头部车企四级密钥体系实践
汽车·kms·车联网·供应链安全·国密算法·汽车行业·ota安全
楚轩努力变强2 个月前
2026 年前端破局:从页面开发到前端隐私计算全链路架构师,构建原生数据安全合规体系
前端·国密算法·数据安全合规·前端安全·web crypto api·前端隐私计算·2026前端趋势
openHiTLS密码开源社区3 个月前
筑牢商密安全根基:形式化验证让openHiTLS密码库安全可证明
国密算法·形式化验证·openhitls·后量子密码·密码算法·内存安全漏洞·功能正确性
芸轩4 个月前
国密算法c#和Java互通
java·开发语言·c#·国密算法·国家加密算法
Light605 个月前
商用密码应用安全性评估备案信息表:从合规底线到安全上限的全面指南
国密算法·ai赋能·商用密码应用·安全性评估·密评备案·密码法·三同步一评估
CVE-柠檬i2 年前
渗透测试-前端验签绕过之SHA256
网络安全·签名·绕过·yakit·yaklang
CVE-柠檬i2 年前
app&小程序&web安全—sign签名绕过
yakit·jeecg·yaklang