大多数密码算法都是块密码算法,需要将明文消息切成固定大小的块,一块一块地进行加密。例如DES就需要将消息切割成一个个64位的块。如果消息长度不是64的整数倍,最后一个消息块就不够64位,这时就要对最后一个消息块进行填充。填充本身是很简单的事情,问题在于有很多种可行的填充方式,如果加密时以某种方式填充,解密时就得理解这种填充方式并去除填充内容,否则很可能解密出来得到的数据就是脏数据。

某些加密标准指定了特定的填充方案。下面简单描述一下这些模式的工作原理。

假定块长度为8字节,要加密的明文数据长度为9字节。那么消息被切成两个块,第二块只有1个字节,需要填充7个字节。假定9字节的明文数据如下:

F1 F2 F3 F4 F5 F6 F7 F8 F9

以下是常见的四种填充方式:

1) Zeros填充:全部填充为0的字节,结果如下:

       F1 F2 F3 F4 F5 F6 F7 F8   //第一块

F9 00 00 00 00 00 00 00  //第二块

2) X923 填充: 填充为0的字节序列,最后一个字节记录填充的总字节数,结果如下:

       F1 F2 F3 F4 F5 F6 F7 F8   //第一块

F9 00 00 00 00 00 00 07  //第二块

2) PKCS7 填充: 每个填充的字节都记录了填充的总字节数,结果如下:

       F1 F2 F3 F4 F5 F6 F7 F8   //第一块

F9 07 07 07 07 07 07 07  //第二块

3) ISO10126 填充: 填充随机字节序列,最后一个字节记录填充的总字节数,结果如下:

       F1 F2 F3 F4 F5 F6 F7 F8   //第一块

F9 7D 2A 75 EF F8 EF 07  //第二块