分组密码模式的填充

分组加密

在密码学中,分组加密(Block cipher),又称分块加密或块密码,是一种对称**算法。 它将明文分成多个等长的模块(block),使用确定的算法和对称**对每组分别加密解密。

常见的分组加密算法有: DES、3DES、AES、IDEA。

常见分组密码算法分组长度和秘钥长度如下表:

密码算法 分组长度 秘钥长度
DES 64 bit/8 byte 64(56+8) bit/8 byte
3DES 64 bit/8 byte 64/64*2/64 * 3 bit
AES 128 bit/16 byte 128/192/256 bit

填充 padding

一般的填充方式有以下几种:

ANSI X9.23

ANSIX923 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零。
假定块长度为8,数据长度为 9,数据: FF FF FF FF FF FF FF FF FF,填充: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

ISO10126

ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。
假定块长度为 8,数据长度为 9,数据: FF FF FF FF FF FF FF FF FF,填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07

PKCS7 (RFC5652)

PKCS7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
假定块长度为 8,数据长度为 9,数据: FF FF FF FF FF FF FF FF FF,填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07,如果恰好8个字节时还要补8个字节的0x08,可以让解密的数据很确定无误的移除多余的字节。 PKCS5 Padding 和 PKCS7 Padding 在这方面是类似的。不同点在于,选择算法的时候如果选用 PKCS5 Padding 填充模式,就是明确指定块大小是 8 个字节。选用 PKCS7 Padding 则是没有明确指定块大小。如果选择算法的时候选用 PKCS7 Padding 填充模式,同时设置块大小为 8 字节,和选用 PKCS5 Padding 填充模式,没有设置块大小(实际已经设置了 8 字节),这两种情况下,两种填充模式没有区别。另外有个值得注意的是,AES 中块大小是固定 16 字节。

补零

填充字符串由设置为零的字节组成
分组密码模式的填充