Pure-Python SM2/SM3/SM4 implementation, fork https://github.com/duanhongyi/gmssl, fix when publickey is 64 bytes 04 begin sign bug.
Project description
GMSSL
GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。
安装
pip install gmssl
SM2算法
RSA算法的危机在于其存在亚指数算法,对ECC算法而言一般没有亚指数攻击算法 SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较其他公钥算法所需密钥长度小很多。
gmssl是包含国密SM2算法的Python实现, 提供了 encrypt、 decrypt等函数用于加密解密, 用法如下:
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. 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进制
4. sign_with_sm3和verify_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_ecb、 decrypt_ecb、 encrypt_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_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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gmssl_fix-0.0.1.tar.gz.
File metadata
- Download URL: gmssl_fix-0.0.1.tar.gz
- Upload date:
- Size: 15.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b5d612ddd4ec74d91ec346d64f4321343ab18fc557532e6198ce961be27636a
|
|
| MD5 |
016112c20af10590ab0ec507cd87f388
|
|
| BLAKE2b-256 |
afd13a1a4f95ea803ba2c6cd7683e6741b4c0909a8be9a3eed29d47128f38b5f
|
File details
Details for the file gmssl_fix-0.0.1-py3-none-any.whl.
File metadata
- Download URL: gmssl_fix-0.0.1-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f47c726231f5ba202380fd945aa9e7406fd9ba1b44a852451ee82dfc453b364
|
|
| MD5 |
e9be1d1cd10845f71b42015931cec630
|
|
| BLAKE2b-256 |
6b1bc419598cadd133a39d6a2f25515c002fbf08fc744620fec08eb6f27d91b6
|