一,介绍
在使用AES和DES等对称加密算法时,待加密的数据可能不是一个完整的数据块(比如8字节一个块,或者16字节一个块), 那么就需要进行填充(padding)。
常见的填充算法包括:ISO9797_M1、ISO9797_M2和PKCS5。
不同的填充算法的规则和填充字符不一样,需要明确下来,不然解密的时候就会出问题。
二,ISO9797_M1
1,DES
规则:
8字节为一块,块对齐才可以加密。
如果数据的长度不够8的倍数,则在数据后面补0x00,直到数据长度满足8的倍数。
如果数据长度已经满足8的倍数,则需要在数据后面再补8字节的0x00。
填充前 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
2,AES
规则:
- 16字节为一块,块对齐才可以加密。
- 如果数据长度不够16的倍数,则在数据后面补0x00,直到数据长度满足16的倍数。
- 如果数据长度已经满足16的倍数,则需要在数据后面再补16字节的0x00。
填充前 D5 37 11 F4 C8 C6 71 23 45 C7 25 37 C1 D2
填充后 D5 37 11 F4 C8 C6 71 23 45 C7 25 37 C1 D2 00 00
……
填充前 D5 37 11 F4 C8 C6 71 23 45 C7 25 37 C1 D2 E3 C9
填充后 D5 37 11 F4 C8 C6 71 23 45 C7 25 37 C1 D2 E3 C9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
三,ISO9797_M2算法
1, DES
规则:
- 8字节为一块,块对齐才可以加密。
- 如果数据长度不够8的倍数,则在后面补一个字节0x80,如果补了之后数据长度满足8的倍数,则填充完成, 但是如果补了一个字节0x80之后,数据长度还不满足8的倍数的话,那么后续接着补0x00,直到数据长度满足8的倍数。
- 如果数据长度一开始就满足8的倍数,则需要在后面再补一字节0x80和7字节0x00。
填充前 D5 37 11 F4 C8 A1 66
填充后 D5 37 11 F4 C8 A1 66 80
…填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 80 00 00
…
填充前 D5 37 11 F4 C8 A1 66 8D
填充后 D5 37 11 F4 C8 A1 66 8D 80 00 00 00 00 00 00 00
2, AES
规则:
- 16字节为一块,块对齐才可以加密。
- 如果数据长度不够16的倍数,则在后面补一个字节0x80,如果补了之后数据长度满足16的倍数,则填充完成。 但是如果补了一个字节0x80之后,数据长度还不满足16的倍数的话,那么后续接着补0x00,直到数据长度满足16的倍数。
- 如果数据长度一开始就满足16的倍数,则需要再后面再补一字节0x80和15字节0x00。
填充前 D5 37 11 F4 C8 A1 66 12 5C 27 9C 2D 19 4A 92
填充后 D5 37 11 F4 C8 A1 66 12 5C 27 9C 2D 19 4A 92 80
…填充前 D5 37 11 F4 C8 A1 66 12 5C 27 9C 2D 19
填充后 D5 37 11 F4 C8 A1 66 12 5C 27 9C 2D 19 80 00 00
…
填充前 D5 37 11 F4 C8 A1 66 12 5C 27 9C 2D 19 4A 92 3C
填充后 D5 37 11 F4 C8 A1 66 12 5C 27 9C 2D 19 4A 92 3C 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
四,PKCS5算法
全名叫PKCS5Padding
1,DES
规则:
- 8字节为一块,块对齐才可以加密。
- 如果数据长度不够8的倍数,还差N个数据,则在数据后面补N个字节的N。
- 如果数据长度满足8的倍数,则填充8字节的0x08。
填充前 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
2,AES
规则:
- 16字节为一块,块对齐才可以加密。
- 如果数据长度不够16的倍数,还差N个数据,则在数据后面补N个字节的N。
- 如果数据长度满足16的倍数,则填充16字节的0x10。
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B
…
填充前 D5 37 11 F4 C8 A1 66 33 15 8A 99 D2 C8
填充后 D5 37 11 F4 C8 A1 66 33 15 8A 99 D2 C8 03 03 03…
填充前 D5 37 11 F4 C8 A1 66 33 15 8A 99 D2 C8 2D C1
填充后 D5 37 11 F4 C8 A1 66 33 15 8A 99 D2 C8 2D C1 01
…
填充前 D5 37 11 F4 C8 A1 66 33 15 8A 99 D2 C8 2D C1 2E
填充后 D5 37 11 F4 C8 A1 66 33 15 8A 99 D2 C8 2D C1 2E 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10