Open liyangzbx opened 3 years ago
我也有这个疑问,最初是无法直接解密32字节数据的时候发现的,后来发现加密32字节的数据多出16字节!
把源码中的padding函数和unpadding函数去掉就好了
经过研究,发现原来是因为填充的问题导致的,gmssl默认采用PKCS7Padding方式填充,16字节的倍数也会填充,会在填充的最后一个字节存放填充的字节数,等解密时,又会将最后填充的字节数删除。 所以密文必须符合 PKCS7Padding方式填充, 否则将很可能解密出来空字符串。
请问,python pip 安装的gmssl就是您的这个吗?里面sm4.py的crypt_ecb函数,这里会对SM4明文数据强制填充,比如我以HEX输入,送入16字节数据,这里仍然会强制填充16字节0x10 0x10...,这样就会输出32字节数据,同样的还有解密时的unpadding,以hex直接送入16字节数据就会报错。此处为什么要强制填充呢?SM4算法是按16字节分组加密,那送入16字节就算可以直接加密不需填充的。如需填充的话,能以让开发者自己在工程代码里选择是否更好?此处能否修改下?