Python使用gmssl库实现SM2与SM4国密算法详解

Theo
Theo
发布时间:2026-10-14 | 2人浏览过
原创

本文介绍如何在Python中利用gmssl库实现SM2和SM4国密算法。SM2基于椭圆曲线,提供非对称加密与签名;SM4为分组密码,支持ECB和CBC模式。文章包含安装方法、CryptSM2及CryptSM4类的初始化、加解密及签名验证的具体代码示例,适用于需要符合中国国家商用密码标准的开发场景。

GMSSL模块介绍与安装

GMSSL模块介绍

GmSSL是国密算法的Python开源实现,涵盖SM2、SM3及SM4等标准。该项目采用类BSD许可证,允许在闭源商业应用中自由使用。

安装模块


pip install gmssl

官方文档地址:https://github.com/duanhongyi/gmssl/blob/master/README.md

SM2算法实现

SM2算法

传统RSA算法面临亚指数攻击风险,而椭圆曲线密码(ECC)如SM2则无此类攻击。SM2是我国自主知识产权的商用密码算法,基于椭圆曲线离散对数问题,其计算复杂度为指数级,求解难度大。在同等安全强度下,SM2所需的密钥长度远小于其他公钥算法。

gmssl库提供了 encrypt和decrypt等函数以实现SM2的加解密功能,具体用法如下:

1. 初始化CryptSM2


import base64
import binascii
from gmssl import sm2, func
#16进制的公钥和私钥
private_key = '00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'
public_key = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'
sm2_crypt = sm2.CryptSM2(
  public_key=public_key, private_key=private_key)

2. encrypt和decrypt


#数据和加密后数据为bytes类型
data = b"111"
enc_data = sm2_crypt.encrypt(data)
dec_data =sm2_crypt.decrypt(enc_data)
assert dec_data == data

3. sign和verify


data = b"111" # bytes类型
random_hex_str = func.random_hex(sm2_crypt.para_len)
sign = sm2_crypt.sign(data, random_hex_str) # 16进制
assert sm2_crypt.verify(sign, data) # 16进制

SM4算法实现

SM4算法

SM4(无线局域网SMS4)是一种分组密码算法,分组长度和密钥长度均为128bit,具体算法细节参考SM4标准。

gmssl库提供了encrypt_ecb、 decrypt_ecb、encrypt_cbc和decrypt_cbc等函数用于SM4的加解密,用法如下:

1. 初始化CryptSM4


from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT

key = b'3l5butlj26hvv313'
value = b'111' # bytes类型
iv = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' # bytes类型
crypt_sm4 = CryptSM4()

2. encrypt_ecb和decrypt_ecb


crypt_sm4.set_key(key, SM4_ENCRYPT)
encrypt_value = crypt_sm4.crypt_ecb(value) # bytes类型
crypt_sm4.set_key(key, SM4_DECRYPT)
decrypt_value = crypt_sm4.crypt_ecb(encrypt_value) # bytes类型
assert value == decrypt_value

3. encrypt_cbc和decrypt_cbc


crypt_sm4.set_key(key, SM4_ENCRYPT)
encrypt_value = crypt_sm4.crypt_cbc(iv , value) # bytes类型
crypt_sm4.set_key(key, SM4_DECRYPT)
decrypt_value = crypt_sm4.crypt_cbc(iv , encrypt_value) # bytes类型
assert value == decrypt_value

以上为Python实现SM2和SM4国密算法的完整示例,更多相关技术文章请关注本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表