安装:
pip 安装
pip install snowland-smx
SM2
国密公钥加解密签名验签
a. 密钥生成
from pysmx.SM2 import generate_keypair
pk, sk = generate_keypair()
签名
from pysmx.SM2 import Sign
len_para = 64
sig = Sign("你好", sk, '12345678abcdef', len_para)
验签
from pysmx.SM2 import Verify
len_para = 64
Verify(sig, "你好", pk, len_para)
加密
from pysmx.SM2 import Encrypt
e = b'hello'
len_para = 64
C = Encrypt(e, pk, len_para, 0) # 此处的1代表e是否是16进制字符串
解密
from pysmx.SM2 import Decrypt
len_para = 64
m = Decrypt(C, sk, len_para)
SM3
国密哈希 a. 方法1:
from pysmx.SM3 import SM3
sm3 = SM3()
sm3.update('abc')
sm3.hexdigest()
b. 方法2:
from pysmx.SM3 import hash_msg
s = 'abc'
hash_msg(s)
c.方法3(推荐方法)
# 待签名字符串与签名密钥进行拼接,拼接结果使用sm3计算签名值。
sgin_str = params_str + toke
sgin_str = sgin_str.replace(" ", "") # 去除全部空格
sgin_str = sgin_str.replace("'", '"') # 去除全部空格
# 计算sm3
sgin = hash(sgin_str)
SM4
国密私钥加解密
a. 加密
这是我在实际操作中遇到的,java和python计算出来的结果不一样,于是以下的方法可以使其一致
from gmssl.sm4 import CryptSM4, SM4_ENCRYPT
def password_encryption(password_data, key):
'''
sm4加密
'''
value = bytes(password_data, encoding='utf-8') # 字符串转bytes类型
mk = bytes.fromhex(key) # 字符串转bytes类型
sm4 = CryptSM4() # 初始化
sm4.set_key(mk, SM4_ENCRYPT) # 密钥及模式
return bytes.hex(sm4.crypt_ecb(value)) # 返回16进制
b. 解密
from pysmx.SM4 import Sm4, ENCRYPT, DECRYPT
key_data = b'hello word errrr...' # 至少16字节
sm4 = Sm4()
sm4.sm4_set_key(key_data, DECRYPT)
sm4.sm4_crypt_ecb(msg)
网友评论