我对密码学比较陌生,所以我想问一个非常基本的问题。
假设我接受字符串“Hello World”并用“1 0 0 0 ....”填充它,直到该块是预定义的大小。然后我哈希那个。
如果我在加密系统中使用这个散列值,那么填充类型是无用的,因为有人可以根据签名的大小来组装包含“Hello World10000 ...”(推断)加密类型)然后基于典型的填充算法构造包含填充的表?
我相信我会遭受一些基本的误解!
或许(?)使上述系统变得有用的唯一方法是始终使用随机垫填充 - 但根据wiki已停止“ISO 10126”,并且该系统使用随机填充。我该如何纠正这种混乱?
答案 0 :(得分:1)
基本上有两个原因可以执行填充:
第一个原因用于ECB和CBC操作模式以及大多数形式的加密哈希。两者都在内部使用特定的块大小,输入大小需要是块大小的精确次数。
现在对于加密哈希,填充被认为是算法的组成部分。因此在内部它将消息填充为单个位设置为1,然后是x个零,其中x介于0和块大小之间。这通常称为位填充。由于始终应用位填充,填充的消息将保持唯一,这当然是加密哈希值所必需的。
显然,您不能对哈希函数的输入执行随机填充。这将导致随机输出。
使用第二填充原因,例如在RSA签名生成和加密期间。这用于填充哈希输出本身。在填充之后,执行RSA模幂运算。填充是必需的,因为原始RSA容易受到各种攻击(如果您的消息由值为1的数字组成,则取幂将导致数字1,仅列出一个问题。)
对于RSA加密,填充内部需要随机性。然而,RSA填充与位填充有很大不同; ISO 10126当然不适用。