Gmsm
ShangMi (SM) cipher suites for Go (Go语言商用密码软件)
Install / Use
/learn @emmansun/GmsmREADME
Go语言商用密码软件
English | 简体中文
Go语言商用密码软件,简称GMSM,一个安全、高性能、易于使用的Go语言商用密码软件库,涵盖商用密码公开算法SM2/SM3/SM4/SM9/ZUC。
用户文档
- SM2椭圆曲线公钥密码算法应用指南
- SM3密码杂凑算法应用指南
- SM4分组密码算法应用指南
- SM9标识密码算法应用指南
- ZUC祖冲之序列密码算法应用指南
- CFCA互操作性指南
- PKCS7应用指南
- PKCS12应用指南
如果你想提问题,建议你阅读提问的智慧。
核心模块
公钥密码算法
SM2 - 椭圆曲线公钥密码算法
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 - 标识密码算法
SM9 标识密码算法的底层数学运算(素域、扩域、椭圆曲线及双线性对)实现于 bn256 包中,支持 amd64、arm64、ppc64x、riscv64 和 loong64 架构的优化实现。
功能特性:
- 密钥生成算法(GM/T 0044-2016)
- 数字签名算法
- 密钥封装机制(KEM)
- 公钥加密算法
- 密钥交换协议
实现细节和优化策略请参阅 SM9 实现及优化 Wiki。
对称密码算法
SM3 - 密码杂凑算法
SM3 密码杂凑算法(GM/T 0004-2012)实现了高效的 SIMD 优化:
架构优化:
- amd64:针对 AVX2+BMI2、AVX、SSE2+SSSE3 指令集优化消息扩展
- arm64:使用 NEON 指令优化消息扩展,并提供基于 A64 扩展密码指令的实现
- s390x/ppc64x:通过向量指令优化消息扩展
详细实现分析请参阅 SM3 性能优化 Wiki。
SM4 - 分组密码算法
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。
ZUC - 祖冲之序列密码算法
祖冲之序列密码算法(GM/T 0001-2012)实现了基于 SIMD、AES 指令和无进位乘法指令的优化,支持 amd64、arm64 和 ppc64x 架构。
功能特性:
- 机密性算法(128-EEA3 / 256-EEA3)
- 完整性算法(128-EIA3 / 256-EIA3)
详细实现分析请参阅 ZUC 实现及优化 Wiki。
消息认证码
CBCMAC - 基于分组密码的消息认证码
符合《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)
工作模式与填充
CIPHER - 分组密码工作模式
实现了《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 - 填充方案
实现了多种符合标准的填充方案,支持常量时间去填充防御 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()仅用于非敏感数据的性能优化
PKI 与证书
SMX509 - 国密证书扩展
基于 Go 标准库 crypto/x509 包扩展,增加了国密算法支持,实现符合《GM/T 0015-2012 基于 SM2 密码算法的数字证书格式规范》。
PKCS#7 - 加密消息语法
基于 mozilla-services/pkcs7 项目(已于 2024 年 2 月归档)扩展,增加了国密算法支持,符合 RFC 2315 标准。
PKCS#8 - 私钥信息语法
基于 youmark/pkcs8 项目扩展,增加了国密算法支持,符合 RFC 5208 / RFC 5958 标准。
密钥协商与随机数
ECDH - 椭圆曲线 Diffie-Hellman
提供类似 Go 标准库 crypto/ecdh 的接口设计,支持 SM2 曲线的密钥协商协议:
支持协议:
- ECDH 密钥协商
- SM2MQV 密钥协商(推荐)
特性:
- 无
big.Int依赖,性能更优 - 可作为
sm2包密钥交换协议的替代实现
DRBG - 确定性随机位生成器
符合《GM/T 0105-2021 软件随机数发生器设计指南》标准,同时兼容 NIST SP 800-90A 部分要求。
特性:
- 使用 NIST 官方测试向量验证
- 不支持并发使用
CFCA 互操作性
CFCA - 中国金融认证中心扩展
提供与 CFCA SADK 的互操作性支持:
功能特性:
- SM2 私钥和证书封装(PKCS#12_SM2 格式)
- 信封加密与数字签名
- CSR 生成与解析
- 私钥解密
后量子密码学
MLKEM - 基于模格的密钥封装机制
符合 NIST FIPS 203 标准,基于 Go 标准库实现。
支持参数集:
- ML-KEM-512
- ML-KEM-768
- ML-KEM-1024
MLDSA - 基于模格的数字签名
符合 NIST FIPS 204 标准。
SLHDSA - 无状态哈希数字签名
符合 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软件免责声明!
支持与关注(⭐)
Related Skills
node-connect
341.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
341.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.4kCommit, push, and open a PR
