easy gmssl for python
Project description
EasyGmSSL for Python
easy_gmssl 是基于 GmSSL(北京大学 GuanZhi 老师团队开源国密算法库)的 Python 封装,提供更友好、更易用的国密算法开发接口。
- Git 仓库:https://github.com/bowenerchen/GmSSL-Python
- 示例代码:https://github.com/bowenerchen/GmSSL-Python/tree/main/demo_easy_gmssl
一、easy_gmssl 支持的能力
| 类别 | 能力 | 说明 |
|---|---|---|
| SM2 | 加解密 | 支持 C1C3C2、C1C3C2_ASN1、C1C2C3、C1C2C3_ASN1 多种密文格式 |
| SM2 | 签名验签 | 支持 RS、RS_ASN1 模式,流式与一次性签名 |
| SM2 | 证书 | X.509 证书解析、CA 验证、摘要验签 |
| SM3 | 哈希 / HMAC / KDF | 一次性哈希 Hash()、流式 HMAC、SM3 KDF、PBKDF2-HMAC-SM3 |
| SM4 | 对称加密 | CBC、CTR、GCM 模式,流式加解密 |
| SM9 | 标识密码 | 加密(主密钥/用户密钥)、签名(主密钥/用户密钥/验签) |
| 其他 | ZUC / 随机数 | 祖冲之序列密码、安全随机数生成 |
所有对外接口统一采用 PascalCase 命名,便于记忆与 IDE 补全。
二、支持的系统
| 平台 | 支持情况 | 前置条件 |
|---|---|---|
| Linux | ✅ | 需安装 CMake、C 编译器 |
| macOS | ✅ | 需安装 CMake、Xcode Command Line Tools |
| Windows | ✅ | 需安装 CMake、Visual Studio Build Tools 或 MinGW |
安装时自动编译底层 C 库,并将动态库安装到 ~/.gmssl_3.1.1_install/,不污染系统路径。
三、AI 对本版本的贡献(Vibecoding 优化 2025-02-15)
本版本在 AI 辅助下完成了 Vibecoding 优化工程,主要改进包括:
- 安装逻辑:路径健壮性、cmake 可用性检查、错误输出增强、并行构建
- 跨平台:Windows 平台 DLL 加载支持,Linux/macOS/Windows 全平台可用
- 接口补全:EasySM3Kdf、EasySM3Pbkdf2、EasySm4CTR、EasySM3Digest.Hash
- Bug 修复:GetSm2PrivateKeyInHex 逻辑、IV 错误信息、GCM 参数校验、RandomData 参数顺序
- 新能力:SM9 标识密码、SM2 证书完整封装
- 命名统一:对外接口统一为 PascalCase(Breaking Change)
- 测试与文档:单元测试 30+ → 68+,新增 SM9/SM2 证书 Demo
详见 docs/VIBECODING_OPTIMIZATION_PROJECT_20250215.md。
四、基于 GmSSL 3.1.1 及选择该版本的原因
easy_gmssl 固定基于 GmSSL 3.1.1,原因包括:
- 算法覆盖完整:3.1.1 已稳定支持 SM2、SM3、SM4、SM9、ZUC 等国密算法及 X.509 证书
- API 稳定:该版本接口稳定,便于长期封装与维护
- 版本锁定:固定版本可避免上游变更带来的兼容性问题,保证
pip install行为可预期
安装时会将 GmSSL 3.1.1 源码编译并安装至 ~/.gmssl_3.1.1_install/,与 gmssl.py 的加载路径一致。
五、为什么有了 GmSSL 还要做 easy_gmssl?
GmSSL 是 C 库,直接使用需要处理编译、链接、ctypes 绑定等。easy_gmssl 在此基础上提供:
- 一键安装:
pip install easy_gmssl即可,自动完成 GmSSL 编译与安装 - 更友好的 API:面向 Python 的类封装,参数说明清晰,降低使用门槛
- 调试能力:支持 SM2 多种密文格式输出、公钥/私钥十六进制读取,便于调试与密钥管理
- 模式扩展:SM2 加解密多种格式、签名 RS/RS_ASN1 模式,适配不同业务需求
- 接口统一:PascalCase 命名、流式与一次性接口并存,符合 Python 使用习惯
六、特色功能
-
便捷安装
- 在通过pip安装本SDK时,具备自动编译底层C库的能力,并且会智能地安装编译好的二进制文件,避免对系统路径造成污染,确保了安装过程的简洁性与独立性,让您无需繁琐的手动配置即可快速上手。
-
SM2增强功能
-
密钥加解密模式多样化 新增了多种SM2密钥加解密模式选择,包括C1C3C2、C1C3C2_ASN1、C1C2C3、C1C2C3_ASN1。这些模式为不同应用需求提供了更灵活的加密策略,无论是在对加密效率有要求,还是对加密数据格式兼容性有考量的场景下,都能找到合适的解决方案。
-
签名验签模式扩展 在SM2签名验签时,增加了RS_ASN1、RS两种模式选择,适应不同的签名规范和验证场景,使签名验签操作更加贴合实际业务需求。
-
密钥读取便捷化 允许用户轻松读取SM2公钥、私钥的十六进制明文,方便在调试、密钥管理等环节快速获取关键信息,提升开发效率。
-
-
基础算法优化
对于SM4和SM3以及随机数生成部分,虽然核心算法基于底层库,但在接口层着重增加了参数说明。这使得即使是初次接触国密算法的开发者,也能迅速理解每个参数的含义与用途,降低了开发门槛,加速项目开发进程。
七、安装指南
只需在命令行中执行以下pip命令即可完成安装:
pip install easy_gmssl
安装过程中,系统会自动处理底层C库的编译与安装事宜,待编译安装完成后即可开启国密算法开发之旅。
八、使用示例
-
SM2密钥加解密
- 输出多种模式下的密文:
from __future__ import annotations from easy_gmssl import EasySm2EncryptionKey, SM2CipherFormat, SM2CipherMode enc = EasySm2EncryptionKey() plain = 'hello,world' # 遍历当前支持的所有 SM2 加解密算法模式 # 当前支持的模式包括: # C1C3C2_ASN1、C1C3C2、C1C2C3_ASN1、C1C2C3 for mode in SM2CipherMode: print(mode, '密文 in Hex:', enc.Encrypt('hello,world'.encode('utf-8'), mode, SM2CipherFormat.HexStr))
-
SM2公钥、私钥读取
from __future__ import annotations from easy_gmssl import EasySm2Key test = EasySm2Key() print('公钥数据 In Hex:', test.GetSm2PublicKeyInHex()) print('私钥数据 In Hex:', test.GetSm2PrivateKeyInHex())
-
SM2签名验签
- 以RS_ASN1模式为例:
from __future__ import annotations import random from easy_gmssl import EasySM2SignKey, EasySM2VerifyKey, SignatureMode signer_id = 'test_signer' print('signer_id hex:', signer_id.encode('utf-8').hex()) # 初始化用于签名验签的 SM2 密钥,此时不需要关心签名值的模式 test = EasySM2SignKey(signer_id = signer_id, pem_private_key_file = './test_keys/tmp_test_sm2_private.pem', password = '123456') plain = bytes([random.randint(0, 255) for _ in range(0, 64)]) print('plain hex:', plain.hex()) print('private key hex:', test.GetSm2PrivateKeyInHex()) print('public key hex:', test.GetSm2PublicKeyInHex()) # 计算签名 test.UpdateData(plain) # 指定签名值模式为 RS 模式,可选 RS、RS_ASN1 sign_value = test.GetSignValue(signature_mode = SignatureMode.RS) print('signature hex:', sign_value.hex()) # 初始化用于验证签名的 SM2 密钥 verify_test = EasySM2VerifyKey(signer_id = signer_id, pem_public_key_file = './test_keys/tmp_test_sm2_public.pem') # 验证签名 verify_test.UpdateData(plain) # 验证签名时同样指定签名值格式为 RS 模式 ret = verify_test.VerifySignature(sign_value, signature_mode = SignatureMode.RS)
-
SM3 哈希、KDF 与 PBKDF2
from easy_gmssl import EasySM3Digest, EasySM3Kdf, EasySM3Pbkdf2 from easy_gmssl.gmssl import SM3_PBKDF2_MIN_ITER # 一次性 SM3 哈希 h = EasySM3Digest.Hash(b'hello,world') # SM3 KDF 密钥派生 kdf = EasySM3Kdf(outlen=16) kdf.UpdateData(b'shared_secret') key, _ = kdf.GetKey() # PBKDF2-HMAC-SM3 dk = EasySM3Pbkdf2.DeriveKey('password', b'salt', SM3_PBKDF2_MIN_ITER, 32)
-
SM4-CBC / SM4-GCM / SM4-CTR
from easy_gmssl import EasySm4CBC, EasySm4GCM, EasySm4CTR from easy_gmssl.gmssl import SM4_BLOCK_SIZE, SM4_CBC_IV_SIZE, SM4_CTR_IV_SIZE key = b'x' * SM4_BLOCK_SIZE iv = b'y' * SM4_CBC_IV_SIZE enc = EasySm4CBC(key, iv, True) cipher = enc.Update(b'plain') + enc.Finish() # SM4-CTR 密文与明文等长 iv_ctr = b'z' * SM4_CTR_IV_SIZE ctr = EasySm4CTR(key, iv_ctr) out = ctr.Update(b'data') + ctr.Finish()
-
ZUC 与随机数
from easy_gmssl import EasyZuc, EasyRandomData, RandomMode from easy_gmssl.gmssl import ZUC_KEY_SIZE, ZUC_IV_SIZE key = EasyRandomData().GetRandomData(ZUC_KEY_SIZE) iv = EasyRandomData().GetRandomData(ZUC_IV_SIZE) zuc = EasyZuc(key, iv) cipher = zuc.Update(b'plain') + zuc.Finish()
-
SM9 标识密码(加密与签名)
from easy_gmssl import EasySM9EncMasterKey, EasySM9EncKey, EasySM9SignMasterKey, EasySM9SignKey, EasySM9VerifyKey # SM9 加密:KGC 生成主密钥,提取用户私钥,加密方用公钥加密,接收方用私钥解密 enc_master = EasySM9EncMasterKey() enc_master.GenerateMasterKey() user_key = enc_master.ExtractKey('alice@example.com') cipher = enc_master.Encrypt(b'hello', 'alice@example.com') plain = user_key.Decrypt(cipher) # SM9 签名:KGC 生成主密钥,提取用户签名私钥,验签方用主密钥公钥验签 sign_master = EasySM9SignMasterKey() sign_master.GenerateMasterKey() sign_key = sign_master.ExtractKey('bob@example.com') sig = sign_key.Sign(b'data') verify_key = EasySM9VerifyKey('bob@example.com', 'sm9_sign_public.pem') ok = verify_key.Verify(b'data', sig)
-
SM2 证书(X.509 解析与验证)
from easy_gmssl import EasySm2Certificate from easy_gmssl.gmssl import SM2_DEFAULT_ID cert = EasySm2Certificate(pem_file='cert.pem') print('Serial:', cert.GetSerialNumber().hex()) print('Subject:', cert.GetSubject()) print('Validity:', cert.GetValidity().not_before, '-', cert.GetValidity().not_after) ok = cert.VerifyByCaCertificate(ca_cert, SM2_DEFAULT_ID) ok2 = cert.VerifyDigestWithSubjectKey(digest, signature)
九、API 接口一览
| 模块 | 类/函数 | 说明 |
|---|---|---|
| SM2 | EasySm2Key |
密钥管理、PEM 导入导出 |
| SM2 | EasySm2EncryptionKey |
加解密(多种密文格式) |
| SM2 | EasySM2SignKey / EasySM2VerifyKey |
签名验签 |
| SM2 | EasySm2Certificate |
X.509 证书解析与 CA 验证 |
| SM3 | EasySM3Digest |
哈希(含 Hash() 一次性) |
| SM3 | EasySM3Hmac |
HMAC |
| SM3 | EasySM3Kdf |
SM3 密钥派生 |
| SM3 | EasySM3Pbkdf2 |
PBKDF2-HMAC-SM3(DeriveKey()) |
| SM4 | EasySm4CBC / EasySm4CTR / EasySm4GCM |
对称加密 |
| SM9 | EasySM9EncMasterKey / EasySM9EncKey |
标识密码加密 |
| SM9 | EasySM9SignMasterKey / EasySM9SignKey / EasySM9VerifyKey |
标识密码签名 |
| 其他 | EasyZuc |
祖冲之序列密码 |
| 其他 | EasyRandomData |
随机数生成 |
更多示例见 easy_gmssl/demo_easy_gmssl/ 目录。
十、注意事项
- 在使用 SM2 密钥加解密、签名验签等功能时,请务必根据实际需求谨慎选择合适的模式,不同模式在数据格式、兼容性等方面存在差异。
- 对于读取的公钥、私钥十六进制明文,要妥善保管,防止泄露,因为这是加密体系的核心机密信息。
- 虽然SDK尽力优化了接口,但国密算法涉及密码学专业知识,在开发高安全性应用时,建议开发者深入了解相关算法原理,确保应用的安全性。
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file easy_gmssl-2.0.1.tar.gz.
File metadata
- Download URL: easy_gmssl-2.0.1.tar.gz
- Upload date:
- Size: 798.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18f74927a4a0a57c46d2912284bc0232a792a0fb8d078c2346b2a05f4b7e9607
|
|
| MD5 |
70971c19234fa6b04b99f55c92b117f1
|
|
| BLAKE2b-256 |
2279d814e2dea25efeeaf7cb945b60b735f9c2c385cedf8a18a2dcce5259f20a
|