duanhongyi / gmssl

a python crypto for sm2/sm3/sm4
MIT License
474 stars 139 forks source link

SM4算法的代码实现不完善吧? #46

Open wzsx150 opened 2 years ago

wzsx150 commented 2 years ago

`

!/usr/bin/env python3

coding=utf-8

from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT

key = b'Dem0_wants_girls' value = bytes.fromhex('5919238bfabd4e4e9622035cb7b1471c') # bytes类型 iv = bytes.fromhex('6dc783252ef5e96363cb48e544342f0b') # bytes类型 crypt_sm4 = CryptSM4(SM4_DECRYPT)

crypt_sm4.set_key(key, SM4_DECRYPT) encrypt_value = crypt_sm4.crypt_cbc(iv , value) # bytes类型 crypt_sm4.set_key(key, SM4_ENCRYPT) decrypt_value = crypt_sm4.crypt_cbc(iv , encrypt_value) # bytes类型 print(encrypt_value) print(decrypt_value) ` 输出结果: b'' b'\x8b\xd4\xc7\x1f\xff\xb97^\x1a\xbb4Y\x82\xc8H\xaf'

显然不能正常加解密。

大佬,是不是没有考虑到sm4加密二进制文件的情况,各种数据都可能会出现在的情况? 建议大佬再完善一下代码,手动点赞!

wzsx150 commented 2 years ago

经过研究,发现原来是因为填充的问题导致的,gmssl默认采用PKCS7Padding方式填充,16字节的倍数也会填充,会在填充的最后一个字节存放填充的字节数,等解密时,又会将最后填充的字节数删除。 所以密文必须符合 PKCS7Padding方式填充, 否则将很可能解密出来空字符串。

建议大佬可以增加多种填充方式的选择,比如0填充,因为 sm4 库就是默认采用0填充

解密的时候也可以检测一下是不是采用了 PKCS7Padding方式填充 ,如果没有,就不要删除最后的若干字符。这样sm4加解密才能做的比较完善。

最后感谢大佬的分享