填充 (密码学)

在密码学中，「填充」指几种不同的操作。

 经典密码学 
许多经典密码会将明文排列成特定的形状（如：正方形、长方形等），而如果明文不能完全符合形状，就需要添加字母来填满形状。 用无意义的字母来填充则更可以阻碍一些密码分析。 

经典填充有时会造成误解，如有名的「the world wonders（全世界都想知道）」。

 对称密码学 

 散列函数 
大多数现代密码学散列函数以固定长度的块处理信息；除了最早的几种，所有散列函数都遵循某种填充格式。 密码学散列函数必须采用格式结尾，以抵御长度扩展攻击。

 块密码工作模式 
如电子密码本（ECB）和密文块链接（CBC）。 为对称密钥加密设计的块密码工作模式要求输入明文长度必须是块长度的整数倍，因此信息必须填充至满足要求。

 位填充 
位填充可用于任意大小的信息。

于信息后添加一个「设定」位（「1」），再添加「重设」位（「0」）至要求大小。「重设」位（「0」）的数量取决于信息末尾到块边缘的距离。以比特表示为「1000 ... 0000」。

这个方法可用于填充任何位长度的信息，而不限于整字节长度的信息。比如，一段 23 位的信息可填充 9 位以填满一个 32 位的块：
 ... | 1011 1001 1101 0100 0010 0111 0000 0000 |

 字节填充 
字节填充可用于可编码为整数字节大小的信息。

 ANSI X9.23 （美国国家标准协会第 X9.23 号标准） 
例：下例中，块大小为 8 字节，需要填充 4 字节（以十六进制表示）。
 ... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

 ISO 10126 （国际标准化组织第 10126 号标准） 
例：下例中，块大小为 8 字节，需要填充 4 字节。
 ... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |

 PKCS7 （公钥密码学标准第 7 号） 
PKCS#7 定义于 RFC 5652 （征求意见草案第 5652 号）。

每个填充字节的值是用于填充的字节数，即是说，若需要填充 N 个字节，则每个填充字节值都是 N 。 填充的字节数取决于算法可以处理的最小数据块的字节数量。
 01
 02 02
 03 03 03
 04 04 04 04
 05 05 05 05 05
 etc.
例：下例中，块大小为 8 字节，需要填充 4 字节。
 ... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |

 补零 
例：下例中，块大小为 8 字节，需要填充 4 字节。
 ... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
 非对称密码学 

 参考资料 

T