下图说明了使用RSA对消息进行数字签名的过程:



如图所示,首先对消息进行哈希处理,然后对哈希计算签名,而不是完整的消息。

为什么在对数据进行签名之前对其进行哈希处理?为什么不对整个消息签名?当然,如果仅对哈希值进行签名,则会节省时间,但是我听说直接对完整消息进行签名也存在安全问题。如果是这样,它们是什么?

#1 楼

除了使用RSA签名而不进行哈希处理时已经提到的雨披性能问题外,我只想添加雨披的安全警告:
重新排序
如果消息$ m> N $和$ N $是RSA模数,则您必须至少执行2个RSA签名,因为$ m $不再适合$ Z_N $。让我们假设它需要$ k $这样的签名,并写消息$ m =(m_1,\ ldots,m_k)$,总签名为$ \ sigma =(\ sigma_1,\ ldots,\ sigma_k)$,即,$ k $ RSA签名。现在,无需任何其他措施,任何持有$(m,\ sigma)$的人都可以通过以下方式操纵消息并采用签名:1)交换任意一对子消息$ m_i $,$ 1 \ leq i \ leq k $和相应的子消息子签名$ \ sigma_i $或2)删除子消息和相应的子签名。
作为交换示例,假设我们有$ m =(m_1,m_2,m_3)$,因此有$ \ sigma =(\ sigma_1,\ sigma_2,\ sigma_3)$,即由3个块组成的消息具有3个独立的RSA签名,则获得$(m,\ sigma)$的对手可以简单地交换,例如交换为$ m' =(m_2,m_3,m_1)$和$ \ sigma'=(\ sigma_2,\ sigma_3,\ sigma_1)$,这是伪造的,因为它显然是有效的签名。
现有伪造
如果在RSA内对消息进行签名之前未对消息使用冗余方案(教科书RSA签名),则它们很容易受到伪造的影响。假设$(e,N)$为RSA的公共签名验证密钥,则可以在Z_N $中随机选择一个签名$ \ sigma \,并将相应的消息计算为$ m \ equiv \ sigma ^ e \ pmod N $。
请注意,给定RSA签名$ \ sigma $,消息$ m $和公共验证密钥$(e,N)$,针对教科书RSA签名的签名验证将检查:$ m \ stackrel {?} {\ equiv} \ sigma ^ e \ pmod N $。
显然,这张支票将被伪造。但是,请注意,对手无法控制$ m $消息的确切含义。特别是,它将是$ Z_N $的随机元素。但是,这在某些应用中可能就足够了,例如,在发布某些令牌时仅对随机数签名时。在消息上应用冗余方案,即在签名之前进行哈希和填充,这样计算出的伪造签名在实践中就毫无用处。涉及散列和填充的消息必须使用。然后,RSA签名提供了强大的安全保证(UF-CMA安全)。

#2 楼

好吧,在签名之前对数据进行哈希处理的一个原因是因为RSA只能处理那么多数据。例如,假设我们使用的是2k RSA密钥,那么我们可能希望对消息进行更长的签名。

这意味着RSA操作可以处理高达2047位的消息;或255个字节。我们通常希望对长度超过255个字节的消息进行签名。通过将消息散列为较小的内容,然后对散列进行签名,可以解决消息长度的问题。现在,我们还可以通过将消息分解为较小的块并签名每个块来解决此问题。但这会增加很多复杂性和费用,而没有特别的理由。 RSA签名过程的一部分。执行散列后,必须将散列填充出来,然后再提供给他们标记为“使用签名者的私钥加密散列”的步骤。相反,在签名验证者使用签名者的公钥之后,他们需要验证“解密”消息中的填充看起来是否有效(除了哈希是期望值之外)。由于不正确执行填充而导致的已知缺陷。

评论


$ \ begingroup $
加法:如果使用一个散列然后应用裸RSA签名函数$ x \ mapsto x ^ d \ bmod N $而无需填充,则使用Desmedt和Odlyzko设计的攻击在选定消息设置中容易遭受乘法伪造,将散列平滑的邮件签名合并到另一个此类邮件的签名中。即使在签名端使用了适当的填充,签名验证的实现也容易受到填充的不正确验证的影响。这是一个例子。
$ \ endgroup $
–fgrieu♦
2014年1月8日在8:16



#3 楼

我在数字签名的背景下回答这个问题。数字签名提供-真实性(该消息是由该消息所声称的发件人发送的)和数据完整性(该消息在传输中未更改的)。使用私钥将整个邮件发送出去。现在,任何人都可以使用公钥解密,但是将无法再次加密(因为私钥仅由发件人持有)。而是说,加密的消息本身在传输过程中发生了更改。接收者将继续使用公共密钥进行解密,并且可能会收到完全不同的消息。现在,目标受众将首先知道谁发送了此消息,但是无法确定消息是否被更改。因此,数据完整性显然丢失了。现在,在传输中,有人可以修改加密的哈希或消息。无论哪种情况,如果消息被编辑,则在接收方的验证(使用公钥解密哈希,从实际数据生成哈希(以明文形式发送)以及将解密的哈希与生成的哈希进行比较)将失败。因此,我们保留了数据完整性和真实性。

评论


$ \ begingroup $
我很难理解这个答案和不赞成票,如果有人可以向我解释KM Raghava的含义以及不赞成票的理由,那将是很棒的
$ \ endgroup $
–乌尔科马
16 Mar 26 '16 at 18:43

$ \ begingroup $
他混合了签名和加密。进行签名时,您已经具有已签名的消息,因此,在他所放入的上下文中,数据完整性无关紧要。与加密相关,尽管加密时您当然不会散列。
$ \ endgroup $
– SatA
17-10-16在8:46