如 AES,DES 一类的分组对称加密算法要求明文数据的字节长度必须是其块大小的倍数,因此在加密明文数据之前我们必须对明文数据进行填充。
- 零填充
零填充是指将需要填充的所有字节都填充为零,该方案尚未被标准化。零填充也被叫做空填充或零字节填充。如果数据长度已经是块大小的倍数了,视情况可以填充块大小长度的填充内容,没有规范。
例:
填充前
DD DD DD DD DD DD DD DD DD DD DD DD
填充后
DD DD DD DD DD DD DD DD DD DD DD DD 00 00 00 00
- ANSI X9.23(ANSI X9.23 是针对块大小为 8 的算法设计的填充模式,该标准已经被撤销)
如果数据是8字节的倍数,则不进行填充;如果数据不够8的倍数,则后面补0x01到0x08的任意随机数并且将填充内容的最后一个字节设置为填充内容的长度。
例:
填充前
DD DD DD DD DD DD DD DD DD DD DD DD
填充后
DD DD DD DD DD DD DD DD DD DD DD DD 00 00 00 04
- ISO 10126(与ANSI X9.23有些类似,且该标准也已经被撤销)
如果数据是8字节的倍数,则补7字节任意随机数和1字节0x08;如果数据不够8的倍数,则后面补任意随机数并且将填充内容的最后一个字节设置为填充内容的长度。
例:
填充前
DD DD DD DD DD DD DD DD DD DD DD DD
填充后
DD DD DD DD DD DD DD DD DD DD DD DD 81 A6 23 04
填充前
DD DD DD DD DD DD DD DD
填充后
DD DD DD DD DD DD DD DD 98 EF 35 27 81 A6 23 08
- ISO9797-1 (Padding method 1)
如果数据是8字节的倍数,则后面补8字节的0x00;如果数据不够8的倍数,则后面补0x00,直到满足8的倍数。
例:
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 00 00 00
填充前 D5 37 11 F4 C8 A1 66 8D
填充后 D5 37 11 F4 C8 A1 66 8D 00 00 00 00 00 00 00 00
- ISO9797-1 (Padding method 2) (同ISO/IEC 7816-4)
如果数据是8字节的倍数,则后面补1字节0x80和7字节0x00;如果数据不够8的倍数,则后面补1字节0x80,如果补1字节0x80后就满足8字节的倍数,则填充完成,若不满足则继续补若干0x00,直到满足8的倍数。
例:
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 80 00 00
填充前 D5 37 11 F4 C8 A1 66
填充后 D5 37 11 F4 C8 A1 66 80
填充前 D5 37 11 F4 C8 A1 66 8D
填充后 D5 37 11 F4 C8 A1 66 8D 80 00 00 00 00 00 00 00
- PKCS#5
如果数据是8字节的倍数,则后面补8字节的0x08;如果数据不够8的倍数,还差N个数据,则再后面补N个字节的N
例:
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 03 03 03
填充前 D5 37 11 F4 C8 A1 66
填充后 D5 37 11 F4 C8 A1 66 01
填充前 D5 37 11 F4 C8 A1 66 8D
填充后 D5 37 11 F4 C8 A1 66 8D 08 08 08 08 08 08 08 08
- PKCS#7
PKCS#7的填充方式和PKCS#5填充方式一样。只是加密块的字节数不同。PKCS#5明确定义了加密块是8字节,PKCS#7的加密块可以是1-255之间。也就是说,在实践中 PKCS#5 和 PKCS#7 是等同的。

发表回复