[1326]python国密gmssl

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

安装

pip install gmssl

SM2算法

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

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

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)
# 对接java 时验签失败可以使用
sm2_crypt = sm2.CryptSM2(
    public_key=public_key, private_key=private_key, asn1=True)
2. encryptdecrypt
#数据和加密后数据为bytes类型
data = b"111"
enc_data = sm2_crypt.encrypt(data)
dec_data =sm2_crypt.decrypt(enc_data)
assert dec_data == data
3. signverify
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
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_cbc
decrypt_cbc等函数用于加密解密, 用法如下:

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(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
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
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
### 使用gmssl库实现SM2 #### 安装gmssl库 为了能够在Python环境中使用`gmssl`库,需要先安装该库。可以通过pip工具来完成安装。 ```bash pip install gmssl ``` #### 钥对生成 在执行任何加或解操作之前,首先要创建一对公私钥。下面展示了如何利用`gmssl`中的功能生成SM2钥对[^1]: ```python from gmssl import sm2, func # 创建一个随机数发生器实例 random_generator = func.RandomGenerator() private_key = '00' * 32 # 初始化私钥为零 public_key = None sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) # 获取新的私钥并打印出来 new_private_key = sm2_crypt.privatekey_to_hex(random_generator) print(f"Private Key: {new_private_key}") # 计算对应的公钥并打印出来 new_public_key = sm2_crypt.get_public_key(new_private_key) print(f"Public Key: {new_public_key}") ``` #### 加过程 一旦拥有了有效的公私钥对之后就可以开始进行数据的加处理了。这里给出一段简单的例子说明怎样通过给定的消息以及接收方提供的公钥来进行消息加: ```python message = b'This is a secret message.' ciphertext = sm2_crypt.encrypt(message, new_public_key) print(f"Cipher Text: {ciphertext.hex()}") ``` #### 解过程 当接收到被加后的信息时,则可以采用相应的私钥对其进行解码恢复原始的信息内容。以下是具体的代码片段展示了解的过程: ```python plaintext = sm2_crypt.decrypt(ciphertext, new_private_key) print(f"Plain Text: {plaintext.decode('utf8')}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值