python gmssl SM4不填充加解密

问题描述

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

解决方法

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

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

例程

python 复制代码
from gmssl import sm4, func

g_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)  # 方法1
    oSM4.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()  # 方法2
    oSM4.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()}')

    return


if __name__ == '__main__':
    main()

例程输出:

enc:681edf34d206965e86b3e94f536e4246002a8a4efa863ccad024ac0300bb40d2

enc:681edf34d206965e86b3e94f536e4246002a8a4efa863ccad024ac0300bb40d2

enc:681edf34d206965e86b3e94f536e42462677f46b09c122cc975533105bd4a22a

enc:681edf34d206965e86b3e94f536e4246

dec:0123456789abcdeffedcba9876543210

enc:681edf34d206965e86b3e94f536e4246

dec:0123456789abcdeffedcba9876543210

注意事项

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

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

相关推荐
郑州光合科技余经理9 小时前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1239 小时前
matlab画图工具
开发语言·matlab
dustcell.10 小时前
haproxy七层代理
java·开发语言·前端
norlan_jame10 小时前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone10 小时前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ40220549610 小时前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
百锦再10 小时前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
QQ51100828510 小时前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
QQ_196328847510 小时前
Python-flask框架西山区家政服务评价系统网站设计与开发-Pycharm django
python·pycharm·flask
遥遥江上月10 小时前
Node.js + Stagehand + Python 部署
开发语言·python·node.js