python gmssl SM4不填充加解密

ops/2024/12/22 20:44:53/

问题描述

 使用gmssl(python版本)进行SM4加/解密时结果与国标(GMT0002)不符,或解密失败,原因是gmssl默认使用PKCS7填充,国标文档里的样例是没有填充的。

解决方法

方法一:创建CryptSM4对象时将填充模式设为-1。这是笔者推荐的方法。

方法二:使用CryptSM4.one_round。这是个底层函数,每次只能加/解密一个分组。

例程

python">from gmssl import sm4, funcg_sData = '0123456789abcdeffedcba9876543210'
g_sKey = '0123456789abcdeffedcba9876543210'def main():bufData = bytes.fromhex(g_sData)bufKey = bytes.fromhex(g_sKey)oSM4 = sm4.CryptSM4()oSM4.set_key(bufKey, sm4.SM4_ENCRYPT)r = oSM4.crypt_ecb(bufData)print(f'enc:{r.hex()}')oSM4 = sm4.CryptSM4(sm4.SM4_ENCRYPT, sm4.PKCS7)oSM4.set_key(bufKey, sm4.SM4_ENCRYPT)r = oSM4.crypt_ecb(bufData)print(f'enc:{r.hex()}')oSM4 = sm4.CryptSM4(sm4.SM4_ENCRYPT, sm4.ZERO)oSM4.set_key(bufKey, sm4.SM4_ENCRYPT)r = oSM4.crypt_ecb(bufData)print(f'enc:{r.hex()}')oSM4 = sm4.CryptSM4(sm4.SM4_ENCRYPT, -1)  # 方法1oSM4.set_key(bufKey, sm4.SM4_ENCRYPT)r = oSM4.crypt_ecb(bufData)print(f'enc:{r.hex()}')oSM4.set_key(bufKey, sm4.SM4_DECRYPT)r = oSM4.crypt_ecb(r)print(f'dec:{r.hex()}')oSM4 = sm4.CryptSM4()  # 方法2oSM4.set_key(bufKey, sm4.SM4_ENCRYPT)r = oSM4.one_round(oSM4.sk, bufData)r = func.list_to_bytes(r)print(f'enc:{r.hex()}')oSM4.set_key(bufKey, sm4.SM4_DECRYPT)#r = func.bytes_to_list(r)r = oSM4.one_round(oSM4.sk, r)r = func.list_to_bytes(r)print(f'dec:{r.hex()}')returnif __name__ == '__main__':main()

例程输出:

enc:681edf34d206965e86b3e94f536e4246002a8a4efa863ccad024ac0300bb40d2
enc:681edf34d206965e86b3e94f536e4246002a8a4efa863ccad024ac0300bb40d2
enc:681edf34d206965e86b3e94f536e42462677f46b09c122cc975533105bd4a22a
enc:681edf34d206965e86b3e94f536e4246
dec:0123456789abcdeffedcba9876543210
enc:681edf34d206965e86b3e94f536e4246
dec:0123456789abcdeffedcba9876543210

注意事项

sm4.ZERO是一个名字叫“ZERO”的填充模式,不是不填充。

------完------


http://www.ppmy.cn/ops/27804.html

相关文章

使用JMeter模拟设备通过MQTT发送数据

需求: 需要一个工具能够支持MQTT协议发送各种不同的数据。 目的: 模拟小型温室设备反馈,搭建一个测试环境,根据测试的数据显示硬件的状态和数值。 工具:JMeter 环境:需要配置Java运行环境。 操作步骤&a…

设计模式-02 设计模式-接口隔离原则案例分析

1.定义 接口隔离原则(Interface Segregation Principle,简称 ISP)是设计模式中的一个原则,它规定客户端不应该依赖它不使用的方法。 换句话说,接口应该被细分为更小的、更具体的接口,以便客户端只依赖于它…

React学习笔记

React全家桶:React基础、React-Router路由、PubSub消息管理、Redux集中式状态管理、Ant-Design一个UI组件库。 一、React入门 1、React是什么? React是用于构建用户界面的JavaScript库。操作DOM呈现页面。是一个将数据渲染成HTML视图的开源JavaScript…

字节跳动(社招)三面算法原题

TikTok 喘息 继上月通过强制剥离 TikTok 法案后,美国众议院在当地时间 20 日下午以 360 票赞成 58 票反对通过了新的法案:剥离 TikTok 的期限由生效后 165 天调整至 270 天之内,即今年 11 月的美国总统大选后。 之前我们讲过,TikT…

<一起学管理>《微课堂2:什么是MSA? 》

1 MSA是什么 测量系统分析(Measurement Systems Analysis,MSA) 的定义:通过统计分析的手段,对构成测量系统的各个影响因子进行统计变差分析和研究以得到测量系统是否准确可靠的结论。 MSA是一种质量管理的工具。 测量系统可分为“计数型”…

MATLAB初学者入门(29)—— 傅里叶分析

傅里叶分析是一种强大的数学工具,用于分解信号为正弦和余弦组成部分。在MATLAB中,可以使用多种方法进行傅里叶分析,包括快速傅里叶变换(FFT)和功率谱密度估计等。这些方法非常适用于信号处理、振动分析、音频处理等领域…

图像处理的一些操作(2)

图像处理 9. 转换类型9.1转换成浮点数类型9.2转换成无符号字节类型 10.颜色空间转换10.1RGB转GRAY10.2RGB转HSV10.3RGB转LAB10.4HSV转RGB10.5LAB转RGB10.6 convert_colorspace函数进行颜色转换 11.标签化处理图像11.1导入模块11.2加载图片11.3RGB图像转灰度图像11.4遍历图像11.…

自动化测试web库(元素定位、元素操作、浏览器操作)

按照谷歌浏览器 Chrome :https://googlechromelabs.github.io/chrome-for-testing/ Chrome使用技巧: 1、找到自己想要的标签 打开检查,点击箭头,再点击你想要点击的地方 2、直接在浏览器上查询,看看是否查询成功 可…