pad mode主要是填充模式,一般是按照8 bytes的数据block长度,在data长度不足block长度或倍数的时候给你补齐。
举个例子:
#use DES cipher
from pyDes import CBC,des,PAD_PKCS5,PAD_NORMAL
import binascii
key = "1234567812345678"
key = bytearray.fromhex(key)
print("key: \t", key, " len: ", len(key))
iv = b"\0\0\0\0\0\0\0\0"
deser = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
print("randomNoStr: \t", randomNoStr, " len: ", len(randomNoStr))
cipherText = deser.encrypt(randomNoStr)
print("cipherText: \t", cipherText, " len: ", len(cipherText))
#import array
print("\tb2a_hex: \t", binascii.b2a_hex(cipherText), " len: ", len(cipherText))
clearText = deser.decrypt(cipherText)
print("clearText: \t", binascii.b2a_hex(clearText))
data 设为8 bytes 16进制的: 87A7097795A865AA
看看你得到了啥:
ciphertext: 1f44d34fb7216844eb4f598a1c871f86
在C语言下,得到的可是:1f44d34fb7216844
多了一截: eb4f598a1c871f86
这是因为这个pad mode设置的PAD_PKCS5填充模式,会按照该模式指定的方式,往传入的data后面塞数据,给你8 bytes填充成16个bytes。
可是我特么8 bytes的key,8 bytes的data,走的还是ECB单加密,我要你填充个毛线啊。
至于这个填充规律是啥,暂时还没研究出来,有空查查RFC,或许有答案。
把padmode从PAD_PKCS5 改为 PAD_NORMAL 不填充,结果就好了。1f44d34fb7216844