加解密中的padding

为什么要padding?

好多现有的加密算法都是块加密算法。它们要求输入的明文是块的整数倍,比方说128bit为一个块大小。但是,很明显地,用户输入的数据并不能够保证恰好是算法块的倍数。所以,才会在最后一部分数据的部分增加padding,以填充完整使得输入要进行加密的数据成为要求块的倍数。

bit padding

位填充适用于任何大小的消息。

位填充的做法是,在消息部分的最后添加一个1和正数个0。0个数取决于算法要求的块的边界。比方说,块大小为32bit,而现有消息是23bit,那么就需要再增加9bit,即一个1,8个0.

… 1011 1001 1101 0100 0010 0111 0000 0000

有的采用了两步padding,它们一般会把位填充方法作为第一个填充方法来使用,像MD5和SHA1。而 ISO/IEC 9797-1则把它定义为了第二种填充方案(Padding Method 2)来使用。

ANSI X.923

是一种字节填充方式,首先填充整数个0作为前缀,最后一个字节是填充字节的数目。

比方,块大小为8字节,最后需要填充4个字节,那么填充的样例如下:

… DD DD DD DD DD DD DD DD DD DD DD DD 00 00 00 04

ISO 10126

对最后一个块进行填充随机的字节,最后一个字节来表示总共填充了多少个有字节。

比方,块大小为8字节,填充了4个字节,那么最后一个字节为04,前面为随机填充的字节数值。

… DD DD DD DD DD DD DD DD DD DD DD DD 81 A6 23 04

PKCS7

01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
etc.

填充样式为上面的某行之一。该填充模式是在 RFC 5652进行描述的。其特征是,需要填充多少个字节,就使用该数值的重复值。

比方, 块大小为8字节,需要填充的字节数目为4,那么就填充4个04

… DD DD DD DD DD DD DD DD DD DD DD DD 04 04 04 04

ISO/IEC 7816-4

ISO/IEC 7816-4:2005 方案等同于位填充方式,只是进行了字节填充。在实际中,第一个字节是一个强制的字节0x80,后续的所有数值全部是 0x00(如果有存在的必要的话)。

比方,块大小为8字节,需要填充4个字节,那么样例为

… DD DD DD DD DD DD DD DD DD DD DD DD 80 00 00 00

如果需要填充1个字节,那么样例为

… DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD 80

Zero padding

零填充则很简单,直接对所有需要填充的字节以0x00进行填充。 只是这种方案不是加密算法的标准方案,但它也在哈希和MAC中作为填充方案使用。

比方,块大小为8字节,需要进行4字节填充,那么

… DD DD DD DD DD DD DD DD DD DD DD DD 00 00 00 00

参考

Table of Contents