大多数密码算法都是块密码算法,需要将明文消息切成固定大小的块,一块一块地进行加密。例如 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 //第二块