| English | 简体中文 |
Go语言商用密码软件,简称GMSM,一个安全、高性能、易于使用的Go语言商用密码软件库,涵盖商用密码公开算法SM2/SM3/SM4/SM9/ZUC。
如果你想提问题,建议你阅读提问的智慧。
SM2 椭圆曲线公钥密码算法的核心实现位于 internal/sm2ec 包中。本实现在性能上与 Go 标准库中 NIST P-256 曲线的原生实现(非 BoringCrypto)相当,并针对 amd64、arm64、s390x、ppc64le、riscv64 和 loong64 架构进行了汇编优化。
功能特性:
详细的性能优化分析和实现细节请参阅 SM2 性能优化 Wiki。
SM9 标识密码算法的底层数学运算(素域、扩域、椭圆曲线及双线性对)实现于 bn256 包中,支持 amd64、arm64、ppc64x、riscv64 和 loong64 架构的优化实现。
功能特性:
实现细节和优化策略请参阅 SM9 实现及优化 Wiki。
SM3 密码杂凑算法(GM/T 0004-2012)实现了高效的 SIMD 优化:
架构优化:
详细实现分析请参阅 SM3 性能优化 Wiki。
SM4 分组密码算法(GM/T 0002-2012)实现了多架构汇编优化,并针对常用工作模式进行了融合优化:
架构优化:
工作模式优化:
详细实现分析请参阅 SM4 性能优化 Wiki。
祖冲之序列密码算法(GM/T 0001-2012)实现了基于 SIMD、AES 指令和无进位乘法指令的优化,支持 amd64、arm64 和 ppc64x 架构。
功能特性:
详细实现分析请参阅 ZUC 实现及优化 Wiki。
符合《GB/T 15852.1-2020 信息安全技术 消息鉴别码算法 第1部分:采用分组密码的机制》标准,实现了多种 MAC 算法:
支持的 MAC 模式:
实现了《GB/T 17964-2021 信息安全技术 分组密码算法的工作模式》标准中定义的多种工作模式:
支持的工作模式:
注意事项:
cipher.BlockMode 接口,内部包含 tweak 状态,不支持并发使用实现了多种符合标准的填充方案,支持常量时间去填充防御 Padding Oracle 攻击:
| 填充方案 | 对应标准 |
|---|---|
| PKCS#7 | GB/T 17964-2021 附录 C.2 填充方法 1 / RFC 5652 |
| ISO/IEC 9797-1 方法 2 | GB/T 17964-2021 附录 C.3 填充方法 2 |
| ANSI X.923 | ANSI X9.23 标准 |
| ISO/IEC 9797-1 方法 3 | GB/T 17964-2021 附录 C.4 填充方法 3 |
| Zero Padding | 非标准(遗留兼容) |
安全实现:
ConstantTimeUnpad() 和 Unpad() 两种方法ConstantTimeUnpad() 防御时序攻击Unpad() 仅用于非敏感数据的性能优化基于 Go 标准库 crypto/x509 包扩展,增加了国密算法支持,实现符合《GM/T 0015-2012 基于 SM2 密码算法的数字证书格式规范》。
基于 mozilla-services/pkcs7 项目(已于 2024 年 2 月归档)扩展,增加了国密算法支持,符合 RFC 2315 标准。
基于 youmark/pkcs8 项目扩展,增加了国密算法支持,符合 RFC 5208 / RFC 5958 标准。
提供类似 Go 标准库 crypto/ecdh 的接口设计,支持 SM2 曲线的密钥协商协议:
支持协议:
特性:
big.Int 依赖,性能更优sm2 包密钥交换协议的替代实现符合《GM/T 0105-2021 软件随机数发生器设计指南》标准,同时兼容 NIST SP 800-90A 部分要求。
特性:
提供与 CFCA SADK 的互操作性支持:
功能特性:
符合 NIST FIPS 203 标准,基于 Go 标准库实现。
支持参数集:
符合 NIST FIPS 204 标准。
符合 NIST FIPS 205 标准。
本软件使用MIT许可证,详情请参考软件许可。如果不熟悉MIT许可证条款,请参考MIT许可证。请知晓和遵守被许可人义务!
本项目的基础架构、设计和部分代码源自golang crypto.
SM4分组密码算法amd64 SIMD AES-NI实现(SSE部分)的算法源自mjosaarinen/sm4ni。
SM9/BN256最初版本的代码复制自cloudflare/bn256项目,后期对基础的素域、扩域、椭圆曲线运算等进行了重写。
祖冲之序列密码算法实现amd64 SIMD AES-NI, CLMUL实现算法源自Intel(R) Multi-Buffer Crypto for IPsec Library项目。
PKCS7包代码是mozilla-services/pkcs7项目(该项目已于2024年2月10日被归档)的一个分支,加入了商用密码扩展。
PKCS8包代码是youmark/pkcs8项目的一个分支,加入了商用密码扩展。
使用本项目前,请务必仔细阅读GMSM软件免责声明!