English | 简体中文
Go语言商用密码软件,简称GMSM,一个安全、高性能、易于使用的Go语言商用密码软件库,涵盖商用密码公开算法SM2/SM3/SM4/SM9/ZUC。
- SM2椭圆曲线公钥密码算法应用指南
- SM3密码杂凑算法应用指南
- SM4分组密码算法应用指南
- SM9标识密码算法应用指南
- ZUC祖冲之序列密码算法应用指南
- CFCA互操作性指南
- PKCS7应用指南
- PKCS12应用指南
如果你想提问题,建议你阅读提问的智慧。
SM2 椭圆曲线公钥密码算法的核心实现位于 internal/sm2ec 包中。本实现在性能上与 Go 标准库中 NIST P-256 曲线的原生实现(非 BoringCrypto)相当,并针对 amd64、arm64、s390x、ppc64le、riscv64 和 loong64 架构进行了汇编优化。
功能特性:
- 数字签名算法(GB/T 32918.2-2016)
- 公钥加密算法(GB/T 32918.4-2016)
- 密钥交换协议(GB/T 32918.3-2016)
- 密钥对保护数据格式(GB/T 35276-2017)
详细的性能优化分析和实现细节请参阅 SM2 性能优化 Wiki。
SM9 标识密码算法的底层数学运算(素域、扩域、椭圆曲线及双线性对)实现于 bn256 包中,支持 amd64、arm64、ppc64x、riscv64 和 loong64 架构的优化实现。
功能特性:
- 密钥生成算法(GM/T 0044-2016)
- 数字签名算法
- 密钥封装机制(KEM)
- 公钥加密算法
- 密钥交换协议
实现细节和优化策略请参阅 SM9 实现及优化 Wiki。
SM3 密码杂凑算法(GM/T 0004-2012)实现了高效的 SIMD 优化:
架构优化:
- amd64:针对 AVX2+BMI2、AVX、SSE2+SSSE3 指令集优化消息扩展
- arm64:使用 NEON 指令优化消息扩展,并提供基于 A64 扩展密码指令的实现
- s390x/ppc64x:通过向量指令优化消息扩展
详细实现分析请参阅 SM3 性能优化 Wiki。
SM4 分组密码算法(GM/T 0002-2012)实现了多架构汇编优化,并针对常用工作模式进行了融合优化:
架构优化:
- amd64:使用 AES-NI 指令结合 AVX2/AVX/SSE2+SSSE3
- arm64:使用 AES 指令结合 NEON,并提供基于 A64 扩展密码指令的实现
- ppc64x:使用 vsbox 指令结合向量指令
工作模式优化:
- ECB(电子密码本)
- CBC(密码块链接)
- GCM(伽罗瓦/计数器模式)
- XTS(可调整密文分组链接,支持 GB/T 17964-2021 和 NIST SP 800-38E)
详细实现分析请参阅 SM4 性能优化 Wiki。
祖冲之序列密码算法(GM/T 0001-2012)实现了基于 SIMD、AES 指令和无进位乘法指令的优化,支持 amd64、arm64 和 ppc64x 架构。
功能特性:
- 机密性算法(128-EEA3 / 256-EEA3)
- 完整性算法(128-EIA3 / 256-EIA3)
详细实现分析请参阅 ZUC 实现及优化 Wiki。
符合《GB/T 15852.1-2020 信息安全技术 消息鉴别码算法 第1部分:采用分组密码的机制》标准,实现了多种 MAC 算法:
支持的 MAC 模式:
- CBC-MAC(方案 1)
- EMAC(方案 2)
- ANSI Retail MAC(方案 3)
- MAC-DES(方案 4)
- CMAC(方案 5,RFC 4493)
- LMAC(方案 6)
- TR-CBC-MAC(方案 7)
- CBCR-MAC(方案 8)
实现了《GB/T 17964-2021 信息安全技术 分组密码算法的工作模式》标准中定义的多种工作模式:
支持的工作模式:
- ECB:电子密码本模式
- CCM:计数器模式与 CBC-MAC 模式(RFC 3610)
- XTS:可调整密文分组链接模式(GB/T 17964-2021 / NIST SP 800-38E)
- HCTR:带泛杂凑函数的计数器模式(GB/T 17964-2021 新增)
- BC:分组链接模式(GB/T 17964 遗留模式)
- OFBNLF:带非线性函数的输出反馈模式(GB/T 17964 遗留模式)
注意事项:
- XTS 模式实现了
cipher.BlockMode接口,内部包含 tweak 状态,不支持并发使用 - BC 模式与 CBC 模式功能相似
- OFBNLF 模式从软件实现角度性能优化空间有限
实现了多种符合标准的填充方案,支持常量时间去填充防御 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 曲线的密钥协商协议:
支持协议:
- ECDH 密钥协商
- SM2MQV 密钥协商(推荐)
特性:
- 无
big.Int依赖,性能更优 - 可作为
sm2包密钥交换协议的替代实现
符合《GM/T 0105-2021 软件随机数发生器设计指南》标准,同时兼容 NIST SP 800-90A 部分要求。
特性:
- 使用 NIST 官方测试向量验证
- 不支持并发使用
提供与 CFCA SADK 的互操作性支持:
功能特性:
- SM2 私钥和证书封装(PKCS#12_SM2 格式)
- 信封加密与数字签名
- CSR 生成与解析
- 私钥解密
符合 NIST FIPS 203 标准,基于 Go 标准库实现。
支持参数集:
- ML-KEM-512
- ML-KEM-768
- ML-KEM-1024
符合 NIST FIPS 204 标准。
符合 NIST FIPS 205 标准。
- Trisia/TLCP - 一个《GB/T 38636-2020 信息安全技术 传输层密码协议》Go语言实现项目。
- Trisia/Randomness - 一个Go语言随机性检测规范实现。
- PKCS12 - SSLMate/go-pkcs12项目的一个分支,加入了商用密码支持,由于PKCS12标准比较老,安全性不高,所以以独立项目进行维护。
- MKSMCERT - 一个用于生成SM2私钥和证书的工具,主要用于开发测试,它是FiloSottile/mkcert项目的一个分支,加入了商用密码支持。
- JavaScript实现
- jsrsasign-sm 扩展jsrsasign实现的优势在于充分利用jsrsasign的PKIX,CSR,CERT,PKCS8等处理能力。
- sjcl-sm 扩展sjcl实现的优势在于其丰富的对称加密模式实现,以及其简洁的代码、较好的性能。
本软件使用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软件免责声明!