duanhongyi / gmssl

a python crypto for sm2/sm3/sm4
MIT License
488 stars 141 forks source link

SM4-ECB加密pad问题 #38

Open liyangzbx opened 3 years ago

liyangzbx commented 3 years ago

请问,python pip 安装的gmssl就是您的这个吗?里面sm4.py的crypt_ecb函数,这里会对SM4明文数据强制填充,比如我以HEX输入,送入16字节数据,这里仍然会强制填充16字节0x10 0x10...,这样就会输出32字节数据,同样的还有解密时的unpadding,以hex直接送入16字节数据就会报错。此处为什么要强制填充呢?SM4算法是按16字节分组加密,那送入16字节就算可以直接加密不需填充的。如需填充的话,能以让开发者自己在工程代码里选择是否更好?此处能否修改下? 微信截图_20210414091820

294068860 commented 2 years ago

我也有这个疑问,最初是无法直接解密32字节数据的时候发现的,后来发现加密32字节的数据多出16字节!

294068860 commented 2 years ago

把源码中的padding函数和unpadding函数去掉就好了

wzsx150 commented 2 years ago

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