课设第一周进展(snowland-smx)
安装snowland-smx
snowland-smx简介
snowland-smx是python实现的国密套件,对标python实现的gmssl,包含国密SM2,SM3,SM4,SM9,ZUC等。其代码实现效率上优于gmssl,接口设计上也更加人性化,目前被snowland-djangohelper等项目使用。
snowland-smx的安装
使用pip指令进行安装
pip install snowland-smx==0.3.2a1
snowland-smx算法实现流程图
snowland-smx实现SM2
使用python3
进入python环境
a. 密钥生成
from pysmx.SM2 import generate_keypair
pk, sk = generate_keypair()
b. 签名
from pysmx.SM2 import Sign
len_para = 64
sig = Sign("你好", sk, '12345678abcdef', len_para)
c. 验签
from pysmx.SM2 import Verify
len_para = 64
Verify(sig, "你好", pk, len_para)
d. 加密
from pysmx.SM2 import Encrypt
e = b'hello'
len_para = 64
C = Encrypt(e, pk, len_para, 0) # 此处的1代表e是否是16进制字符串
e. 解密
from pysmx.SM2 import Decrypt
len_para = 64
m = Decrypt(C, sk, len_para)
snowland-smx实现SM3
a. 方法一
from pysmx.SM3 import SM3
sm3 = SM3()
sm3.update('abc')
sm3.hexdigest()
b. 方法二
from pysmx.SM3 import hash_msg
s = 'abc'
hash_msg(s)
snowland-smx实现SM4
a. 加密
>>> from pysmx.SM4 import Sm4, ENCRYPT, DECRYPT
>>> key_data = b'20201325xjrxjrxjr'
>>> sm4 = Sm4()
>>> input_data = [1,2,3]
>>> sm4.sm4_set_key(key_data, ENCRYPT)
>>> msg = sm4.sm4_crypt_ecb()
按照网上资料我做到这个发现在执行msg = sm4.sm4_crypt_ecb()
的时候发生了如下报错
File "<stdin>", line 1, in <module>
TypeError: sm4_crypt_ecb() missing 1 required positional argument: 'input_data'
我以为是没有传入传输input_data的原因,然后我将input_data数组放进去后:
发现报了一堆错误,这时候我们细看错误会发现 其错误原因是发生在路径为/usr/local/lib/python3.9/site-packages/pysmx/SM4/_SM4.py的SM4.py文件
File "/usr/local/lib/python3.9/site-packages/pysmx/SM4/_SM4.py", line 153, in sm4_crypt_ecb
output_data = reduce(lambda a, b: a + b, map(lambda x: self.sm4_one_round(self.sk, x), tmp), [])
随后我才用cat指令查看这个文件
cat /usr/local/lib/python3.9/site-packages/pysmx/SM4/_SM4.py的SM4.py
可以看到input_data数组应该是至少为16位
我将input_data改为了
input_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
然后再执行 msg = sm4.sm4_crypt_ecb(input_data)
就成功啦!
解密
- 使用以下命令进行解密
>>> from pysmx.SM4 import Sm4, ENCRYPT, DECRYPT
>>> key_data = b'20201325xjrxjrxjr'
>>> sm4 = Sm4()
>>> sm4.sm4_set_key(key_data, DECRYPT)
>>> sm4.sm4_crypt_ecb(msg)