python实现sm2和sm4国密(国家商用密码)算法的示例
作者:小小咸鱼YwY 发布时间:2021-11-17 08:02:13
GMSSL模块介绍
GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。
安装模块
pip install gmssl
https://github.com/duanhongyi/gmssl/blob/master/README.md官方文档
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)
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进制
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()
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
来源:https://www.cnblogs.com/pythonywy/p/13638806.html
猜你喜欢
- 1下载安装1.1打开官网http://www.jetbrains.com/pycharm/download/#section=windows
- 一、前言1.1.环境python版本:3.6Django版本:1.11.61.2.预览效果最终搭建的blog的样子,基本上满足需求了。框架搭
- 我就废话不多说了,大家还是直接看代码吧~import tensorflow as tfimport syswith tf.variable_
- (在lua中通过loadfile, setfenv实现)python当然也可以:cat config.pybar = 10foo=100ca
- 本文实例讲述了python处理大数字的方法。分享给大家供大家参考。具体实现方法如下:def getFactorial(n): &
- SQL Server管理,你做得好吗?下文这些可能会对你的工作有一些帮助,不妨耐心的看看吧。1. 数据库文件有.mdf .ndf .ldf三
- 我就废话不多说了,大家还是直接看代码吧~import numpy as np#从scipy库中导入插值需要的方法 interpolatefr
- vue+el使用this.$confirm不能阻断代码往下执行在vue+element ui的前端框架中使用el的confirm弹窗,遇到一
- Python中的模块(.py文件)在创建之初会自动加载一些内建变量,__name__就是其中之一。Python模块中通常会定义很多变量和函数
- 子线程里是不能更新UI界面的,在移动端方面。Android的UI访问是没有加锁的,多个线程可以同时访问更新操作同一个UI控件。也就是说访问U
- 在读取dict的key和value时,如果key不存在,就会触发KeyError错误,如:t = { 'a':
- 本文实例讲述了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作
- 程序思路:此次程序主要是利用PIL(Python Image Libraty)这库,来进行图片的处理。PIL是一个功能非常强大的python
- 1.准备工作1.在文件里找到设置2.在项目里找到python解释器,点击右边的加号3.搜素pygame并安装同理下载pgzero安装包2.开
- 本文为大家分享了mysql 8.0.20 winx64安装配置方法,记录如下。MySQL官网:链接直接点击链接也可以下载:mysql 8.0
- 功能描述:1)使用tkinter设计程序界面;2)调用Windows API函数实现录音机和音乐播放器。参考代码:运行界面:总结以上所述是小
- 今天偶尔在一个学习网站技术的地方看到一个教程,关于html代码的,刚看到咱常用到的视频播放器html标签Object,平时用到他的时候都是为
- 使用SQL语句从电脑导入图片到数据库的方法,具体代码如下所示:--创建图片表CREATE TABLE W_PIC( ID INT
- 有向无环图拓扑排序是针对有向无环图(DAG, Directed Acyclic Graph)的具有以下性质:如果这个图不是 DAG,那么它是
- 我们在使用selenium库调用Chromedriver.exe时需要很多的配置参数下面列出了常用参数chrome_options.add_