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

来源:https://www.cnblogs.com/pythonywy/p/13638806.html

标签:python,sm2,sm4,国密,算法
0
投稿

猜你喜欢

  • SQL Server 2000安装图解教程

    2009-09-09 19:59:00
  • 详细解读php的命名空间(一)

    2023-06-19 08:02:59
  • 从一道js笔试题到==运算符的简析

    2010-05-10 20:28:00
  • Javascript:keyCode键盘键码值表

    2008-02-21 13:16:00
  • python中的tkinter库弹窗messagebox详解

    2023-11-12 04:02:05
  • 内容为空时提交如何处理

    2009-07-17 18:25:00
  • 非原型 不设计

    2010-01-21 12:51:00
  • EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页

    2011-04-08 10:40:00
  • Scripting.Dictionary 对象

    2007-10-13 09:46:00
  • python实现可视化动态CPU性能监控

    2023-08-08 10:23:52
  • Div+CSS布局入门教程

    2007-09-13 12:52:00
  • PyQt5实现暗黑风格的计时器

    2023-07-07 02:49:30
  • ASP中实现分页显示的七种方法

    2007-09-20 13:19:00
  • php实现网站留言板功能

    2023-11-23 21:06:36
  • 树型结构在ASP中的简单解决

    2007-10-07 12:52:00
  • 如何用表单的方式推送请求的信息?

    2010-06-16 09:47:00
  • PHP中substr_count()函数获取子字符串出现次数的方法

    2023-11-14 14:28:17
  • 从JavaScript的函数重名看其初始化方式

    2023-07-16 22:00:12
  • 从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解

    2023-09-04 10:21:28
  • ASP实现多域名同一空间的处理实例

    2008-10-29 09:46:00
  • asp之家 网络编程 m.aspxhome.com