python实现sm2和sm4国密(国家商用密码)算法的示例


Posted in Python onSeptember 26, 2020

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实现, 提供了 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)

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_ecbencrypt_cbcdecrypt_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

以上就是python实现sm2和sm4国密(国家商用密码)算法的示例的详细内容,更多关于python 实现国家商用密码算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python随机生成一个6位的验证码代码分享
Mar 24 Python
python打开url并按指定块读取网页内容的方法
Apr 29 Python
Python封装shell命令实例分析
May 05 Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
Python 操作MySQL详解及实例
Apr 30 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 #Python
如何利用python发送邮件
Sep 26 #Python
Python 测试框架unittest和pytest的优劣
Sep 26 #Python
浅析python函数式编程
Sep 26 #Python
python用Configobj模块读取配置文件
Sep 26 #Python
Python内存泄漏和内存溢出的解决方案
Sep 26 #Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 #Python
You might like
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
PHP PDO操作总结
2014/11/17 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python 学习笔记
2008/12/27 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
Python学习之用pygal画世界地图实例
2017/12/07 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
Python函数中不定长参数的写法
2019/02/13 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
django框架模板语言使用方法详解
2019/07/18 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
介绍一下你对SOA的认识
2016/04/24 面试题
电大自我鉴定
2013/10/27 职场文书
婚礼主持词
2014/03/13 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
离婚民事起诉状
2015/08/03 职场文书
感恩主题班会教案
2015/08/12 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang