python gmssl SM4不填充加解密

问题描述

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

解决方法

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

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

例程

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”的填充模式,不是不填充。

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

GMSSL是一个通用的加密库,它提供了一套完整的密码算法支持,包括SM4在内的对称加密算法。SM4_FPE_FF3通常指基于SM4(中国标准加密体制)的填充模式FF3(Finalization Function for FFX)的FPE( Format-Preserving Encryption),这是一种特殊的加密技术,能够在保持输入数据格式不变的情况下进行加密。 在Python中使用GMSSL来实现SM4_FPE_FF3,你需要先安装GMSSL库,然后按照以下步骤操作: 1. **导入库**: ```python from gmssl import sm4 ``` 2. **创建SM4实例**: ```python key = b"your_secret_key" # SM4密钥 cipher = sm4.SM4(key) ``` 3. **设置填充模式和加密模式**: ```python mode = sm4.MODE_ECB # 或者其他模式,比如MODE_CBC等,取决于你的需求 ``` 4. **利用FF3填充函数**: GMSSL库可能不会直接提供FF3填充函数,但你可以自定义一个函数来实现,例如: ```python def ff3_encrypt(text, block_size): padded_text = text + (block_size - len(text) % block_size) * b'\x00' encrypted_blocks = [] for i in range(0, len(padded_text), block_size): encrypted_blocks.append(cipher.encrypt(padded_text[i:i+block_size])) return b''.join(encrypted_blocks) ``` 5. **加密过程**: ```python original_data = b"your_data_to_encrypt" encrypted_data = ff3_encrypt(original_data, cipher.block_size) ``` 6. **解密时使用相同的ff3_decrypt函数,逆向操作即可得到原始数据**。 请注意,实际应用中需要确保密钥的安全管理和正确处理,以及了解FF3填充模式的具体细节。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值