[1326]python国密gmssl

@toc

GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。

安装

shell 复制代码
pip install gmssl

SM2算法

RSA算法的危机在于其存在亚指数算法,对ECC算法而言一般没有亚指数攻击算法 SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较其他公钥算法所需密钥长度小很多。

gmssl是包含国密SM2算法的Python实现, 提供了 encryptdecrypt等函数用于加密解密, 用法如下:

1. 初始化CryptSM2

python 复制代码
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)
# 对接java 时验签失败可以使用
sm2_crypt = sm2.CryptSM2(
    public_key=public_key, private_key=private_key, asn1=True)

2. encryptdecrypt

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

3. signverify

python 复制代码
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进制

4. sign_with_sm3verify_with_sm3

python 复制代码
data = b"111" # bytes类型
sign = sm2_crypt.sign_with_sm3(data) #  16进制
assert sm2_crypt.verify_with_sm3(sign, data) #  16进制

SM4算法

国密SM4(无线局域网SMS4)算法, 一个分组算法, 分组长度为128bit, 密钥长度为128bit, 算法具体内容参照SM4算法

gmssl是包含国密SM4算法的Python实现, 提供了 encrypt_ecbdecrypt_ecbencrypt_cbcdecrypt_cbc等函数用于加密解密, 用法如下:

1. 初始化CryptSM4

python 复制代码
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(padding_mode=3)    # 默认填充为"3-PKCS7"

原项目中SM4算法使用的是PKCS7填充算法,因开发需求,添加填充0算法

在原有项目中,扩充了NoPadding、ISO9797M2、PBOC三种填充算法。对于原有的'padding_mode'取值进行了重新排序。

通过padding_mode参数完成加解密数据填充算法的选择:

  • 0:NoPadding,不做填充处理,需要保证传入数据字节长度为16的倍数。
  • 1:ZERO,遵循《ANSI X99/X9.19》标准,传入数据补位0x00至16倍数长度。
  • 2:ISO9797M2,遵循《ISO/IEC 9797-1》标准,传入数据不足16字节,强制补0x80再用0x00补齐16的倍数。当数据为16倍数时,同样需要强制填充1字节0x80,再补15字节0x00。
  • 3:PKCS7,传入数据不足16字节,需要填充n个字节,补位内容就是n,例如缺5字节,补位"0505050505"。当数据为16倍数时,需要补充16字节'10'。
  • 4:PBOC,参考PBOC2018规范第7部分11.1.1章节。如果数据长度不是16的整数倍,则填充1字节0x80,再填充0x00到分组长度的整数倍。如果数据长度是分组长度的整数倍则不填充。

2. encrypt_ecbdecrypt_ecb

python 复制代码
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_cbcdecrypt_cbc

python 复制代码
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
相关推荐
文心快码BaiduComate9 小时前
Comate 搭载GLM-5.2:百万上下文,稳定支撑长程任务
前端·程序员·开源
程序员cxuan10 小时前
分享一下我最近常用的 10 个 Codex 小技巧。
人工智能·后端·程序员
Moonbit11 小时前
MoonBit ×CCF开源创新大赛 倒计时24天!快来提交你的作品
程序员·编程语言
zzzzzz31011 小时前
假如我是掘金管理员,我先给评论区装个'代码审查'系统
python·程序员·机器人
demo007x1 天前
Docling 文档转换以及技术架构分析
前端·后端·程序员
保持当下1 天前
分享一些程序员很棘手但是却又简单的工具
程序员·免费·js·工具
Hilaku1 天前
AI 写代码越快,为什么 Code Review 越不能省?
前端·javascript·程序员
程序员cxuan1 天前
LobsterAI 快把职业门槛打没了
人工智能·程序员
Coffeeee1 天前
Codachi — 藏在 Claude Code 状态栏里的电子宠物
人工智能·程序员·claude