国密算法:利用python进行sm4算法的加解密,对称密钥
本篇利用python中的gmssl库进行sm4算法的加解密演示。
国密算法sm4特点:
- 密钥长度:16bytes(128bits)
- 分组长度和密钥长度均为128bits;
- 是对称加密算法;分为ecb模式和cbc模式;
- 明文和密文的长度相同;
- 同样的数据,同样的key,每次加密结果一样。
- 与DES和AES算法相似,国密SM4算法是一种分组加密算法。SM4分组密码算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成;
- 加密算法和密钥扩展算法迭代轮数均为32轮;SM4加解密过程的算法相同但是轮密钥的使用顺序相反;
- SM4密码算法使用模2加和循环移位作为基本运算;
- 密钥扩展算法:SM4算法使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,总共使用32个轮密钥。
因此需要使用密钥扩展算法,从加密密钥中产生32个轮密钥。
gmssl库中的sm4:
python提供了sm4算法相关的包,可以用导入gmssl包,利用这个包提供的sm4算法进行数据的加解密。
#导入国密算法sm4包
from gmssl import sm4
常用API:
实例化:sm4.CryptSM4()
设置加密密钥key:set_key(key, sm4.SM4_ENCRYPT) # 设置密钥
加密:crypt_ecb(plaintext)
设置解密密钥key:set_key(key, sm4.SM4_DECRYPT) # 设置密钥
解密:crypt_ecb(chipertext)
测试代码:
import binascii#导入国密算法sm4包
from gmssl import sm4def sm4_encode(key, data):"""国密sm4加密:param key: 密钥:param data: 原始数据:return: 密文hex"""sm4Alg = sm4.CryptSM4() # 实例化sm4sm4Alg.set_key(key.encode(), sm4.SM4_ENCRYPT) # 设置密钥dateStr = str(data)print("明文:", dateStr);enRes = sm4Alg.crypt_ecb(dateStr.encode()) # 开始加密,bytes类型,ecb模式enHexStr = enRes.hex()print("密文:", enHexStr);return enHexStr # 返回十六进制值# return encrypt_value.hex() def sm4_decode(key, data):"""国密sm4解密:param key: 密钥:param data: 密文数据:return: 明文hex"""sm4Alg = sm4.CryptSM4() # 实例化sm4sm4Alg.set_key(key.encode(), sm4.SM4_DECRYPT) # 设置密钥deRes = sm4Alg.crypt_ecb(bytes.fromhex(data)) # 开始解密。十六进制类型,ecb模式deHexStr = deRes.decode()print("解密后明文:", deRes);print("解密后明文hex:", deHexStr);return deHexStr#测试函数
def test():key = "E1A90FB64DDE12AE"; strData = "12345abcde"enHexRes = sm4_encode(key,strData);print("解密测试===",enHexRes);sm4_decode(key,enHexRes);# main
if __name__ == '__main__':print("main begin");test();
测试结果:
% python sm4_t3.py
main begin
明文: 12345abcde
密文: 39b1d120849884da97b57830de18fb75
解密测试=== 39b1d120849884da97b57830de18fb75
解密后明文: b’12345abcde’
解密后明文hex: 12345abcde
国密算法:利用python进行sm4算法的加解密,对称密钥相关推荐
- python二元函数如何编写_利用python实现PSO算法优化二元函数
python实现PSO算法优化二元函数,具体代码如下所示: import numpy as np import random import matplotlib.pyplot as plt from ...
- 国密局公开SM2和SM3算法或预示中国商密算法将走向开放
临近2010年年底的时候,在国密局的网站上公布了基于椭圆曲线ECC的SM2公开密钥国密算法和SM3杂凑算法.加上原来的SM1商密对称算法,中国定义的算法终于开始成熟并且以一个大方的姿态展示出来了. 此 ...
- 利用 Python 实现 K-means 算法
利用 Python 实现 K-means 算法 使用 Python 实现K-means算法,采用随机函数随机在二维平面上生成100个点,然后使用所写程序对这100个点进行聚类[可以采用SSE(Su ...
- python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码
利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...
- 【机器学习与算法】python手写算法:Cart树
[机器学习与算法]python手写算法:Cart树 背景 代码 输出示例 背景 Cart树算法原理即遍历每个变量的每个分裂节点,找到增益(gini或entropy)最大的分裂节点进行二叉分割. 这里只 ...
- 实用脚本!利用 Python 对 PDF 进行加密、解密操作,代码拿走就用!
来源/早起Python 本文将分享如何利用 Python 对 PDF 进行加密和解密操作,主要利用到之前多次介绍过的PyPDF2 模块. PDF 加密 在之前的文章PDF合并.拆分.水印.加密中简单提 ...
- python录入数据至ppt_利用Python进行数据分析之 数据加载.ppt
利用Python进行数据分析之 数据加载 " " " " 数据加载,存储与文件格式 1,读写文本格式数据: (read_csv,read_table,read_ ...
- python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密
原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...
- 基于mbedTLS算法库实现国密SM2签名和验签算法
网上有大量的基于OpenSSL实现的国密算法库,比如著名的GmSSL,可以直接拿来用.我自己常用的是mbedTLS的算法库,比较小巧简单,在mbedTLS的大数算法的基础上实现了国密SM2的签名和验签 ...
最新文章
- java人名识别_HanLP中人名识别分析(示例代码)
- Django—模板渲染
- 创业,程序员心中说不出的痛
- android webview webp,iOS WebView中使用webp格式图片的方法
- Netty源码学习(零)前言
- pycharm连接sqlite
- iphone 通过获取IMSI判断运营商
- Sage CRM升级注意事项二
- 艾伟也谈项目管理,我的项目管理观点
- matlab三相系统电阻折算,基于MATLAB三相异步电动机调压调速系统方案.doc
- 小学计算机室培训心得,小学计算机培训心得体会
- 服务器托管费用怎么计算?
- 论文阅读笔记(11):Adaptive Self-Paced Deep Clustering with Data Augmentation,用数据增强的自适应Self-Paced深度聚类
- python幂函数无序分布_Python:从幂律分布中生成随机数
- CDA Level2建模备考心得
- 如何查看windows软件激活状态
- Agent with Tangent-based Formulation and Anatomical Perception for Standard Plane Localization in 3D
- Java中List集合的addAll方法的小坑
- A quick first look at the kernel printk()
- PHP+PHPQRcode写一个二维码接口api