加解密中的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