python gmssl SM4不填充加解密

server/2024/10/18 18:13:44/

问题描述

 使用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/server/28042.html

相关文章

如何给无法修改的类增加一个父类?mlir某机制

一.从这个问题说起 如果我们使用了一个库&#xff0c;这个库的代码是无法修改的&#xff0c;其中包含一个类class A。 我们在代码中定义了一个类B,如何让A继承自我的写的B呢&#xff1f; 二.奇怪的代码 &#xff1a; class Conv2dOp : public ::mlir::Op<Conv2dOp, ::mlir…

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章&#xff0c;但是在开发中有时候也会在UI的界面中播放视频&#xff0c;这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image&#xff0c;UI->…

微信小程序 - 登录(切屏后继续倒计时)

屏幕休眠或后台运行倒计时暂停问题 updateTime: function () {let promise new Promise((resolve, reject) > {var beginTime new Date().getTime();let setTimer setInterval(() > {var newTime new Date().getTime();var dTime (newTime - beginTime) / 1000;dTim…

【Qt之·路径获取】

系列文章目录 文章目录 前言一、使用相对路径1.1 相对路径1.2 绝对路径1.3 QDir类1.4 QFileDialog对话框 二、示例2.1 示例一 总结 前言 在进行Qt开发时&#xff0c;经常需要获取文件的路径&#xff0c;如图片、音频、配置文件等。路径的获取可以通过直接指定绝对路径或者使用相…

Ubuntu22.04安装freecad、ODAFileConverter

一、背景 作为程序界的萌新&#xff0c;不只写代码&#xff0c;还需要临危受命看看CAD图。 手上的一份CAD图是DWG格式的&#xff0c;先得找款看DWG格式文件的软件&#xff0c;很快找到了“CAD迷你看图”&#xff0c;这款软件直接傻瓜式安装&#xff0c;不是本文重点。 本文重…

【论文阅读】ESRT-Transformer for Single Image Super-Resolution

ESRT-Transformer for Single Image Super-Resolution 论文地址摘要1. 引言2.相关工作2.1 基于 CNN 的 SISR 模型2.2 Vision Transformer Transformer 3. Efficient Super-Resolution Transformer3.1. Lightweight CNN Backbone (LCB)3.2. High-frequency Filtering Module (HF…

RMQ从入门到精通

一.概述与安装 //RabbitMQ //1.核心部分-高级部分-集群部分 //2.什么是MQ 消息队列message queue 先入先出原则;消息通信服务 //3.MQ的大三功能 流量消峰 应用解耦 消息中间件 //&#xff08;1&#xff09;人-订单系统(1万次/S)—> 人 - MQ(流量消峰,对访问人员进行排队) -…

6.k8s中的secrets资源-初识secret

目录 一、Secret 二、创建secrets资源 1.创建工作目录 2.尝试使用base64进行编码 3.声明式创建secrets资源 4.响应式创建secret 三、pod引用secret资源 1.pod资源env环境变量引用 2.pod资源volume存储卷引用secret资源 3.pod资源清单指定key引用secret 四、secret类型…