使用相同的RSA密钥对进行加密/解密以及签名/验证是否安全?
#1 楼
最简洁的答案是不。这是密码学的一般智慧:不要将同一密钥用于多于一件的事情。 “事物”表示一种特定的方案,其中所有参数都与密钥本身和消息大小分开固定。不要使用相同的密钥进行加密和签名; PKCS#1v1.5和PSS不要使用相同的密钥;请勿将相同的键用于不同的哈希函数。如果您使用原始RSA操作($ M ^ d \ bmod n $或$ M ^ e \ bmod n $),则不会,使用相同的密钥是不安全的,因为攻击者可能诱使私钥持有者签署消息$ M $(即生成$ M ^ d $),而该消息实际上是加密的消息($ M = P ^ e $),因此,攻击者可以恢复原始的纯文本($(P ^ e)^ d = P $)。 (双重攻击会导致伪造。)但是,原始RSA操作还有其他一系列缺陷,使其作为加密或签名方案不安全。
基于RSA使用的加密和签名方案填充模式。标准填充模式包括判别式,因此加密有效载荷看起来不像签名有效载荷。因此,从密码学角度来讲,使用相同的RSA密钥对进行签名和加密在技术上是安全的,前提是密钥对可以安全地用于签名和安全地用于加密。在这里,我的意思是从狭义上讲是安全的,假设一个“完美”的世界,其中所有应该保密的东西仍然是秘密。
问题是,这个世界并不完美。 RSA的实现可能会通过边信道泄漏部分信息。密钥被泄露。使用RSA的协议有时会以非常脆弱的方式使用它。
对加密和签名使用相同的密钥可能会加剧漏洞。 RSA有一个弱点历史,不是在数学算法本身上(一旦使用适当的填充),而是在实现方式上。尤其需要解密,因为某些输入是无效的,仅显示输入是否有效的行为就可以允许oracle攻击,其中最著名的是Bleichenbacher。 TLS¹中使用RSA解密的方式加剧了这一点,因为它造成了无效的第二个原因:密文对于解密操作可能无效,或者对于解密有效,但是解密为无效内容。这导致了针对使用RSA解密的TLS密码套件的一系列实际攻击。对加密和签名使用相同的密钥有两个缺点。最明显的是,如果解密中的漏洞允许攻击者恢复密钥,那么依赖签名的任何内容也将被破坏。不太明显的是,即使攻击者无法恢复密钥,但可以获取有关解密无效密文的部分信息,它们也可能伪造签名。例如,使用Bleichenbacher攻击的CAT变体就是这种情况,因此,即使服务器不对RSA签名密码套件使用相同的密钥,即使不接受RSA解密密码套件的客户端也仍然存在风险。
另一个原因是密钥管理。签名密钥和加密密钥在备份,访问控制,否认等方面有不同的要求。在发生灾难性事件时,签名密钥的后备状态是销毁它,以避免将来出现伪造,因此签名密钥不需要广泛备份。相反,加密密钥的后备方法是保留它以解密现有文档,因此需要可靠地对其进行备份。万一签名密钥泄露,则现有文件不受影响;只有新产生的签名才能被拒绝。相反,在加密密钥泄漏的情况下,所有先前存在的文档的机密性都会受到威胁,而新文档仅需要使用不同的密钥进行加密。约束向不同的方向推送,因此需要对密钥进行不同的管理,它们必须有所不同。
¹,即,名称以
TLS_RSA_
开头的密码套件。名称以TLS_(EC)DH(E)_RSA
开头的密码套件使用RSA签名,而不是RSA解密,并且功能更强大。 评论
$ \ begingroup $
这是对这个问题的正确答案!我希望它最终能在投票方面达到最高水平,哈哈。
$ \ endgroup $
–沮丧Daniel
16年11月25日,0:01
$ \ begingroup $
您说:“从密码上来说,使用相同的RSA密钥对进行签名和加密是安全的”。您能否指出文献中已证明这一点的地方?我不相信它被广泛接受:可能没有已知的攻击,但是我不相信您的说法已被证明是正确的。
$ \ endgroup $
– arthurmilton
19年5月17日在10:06
$ \ begingroup $
@arthurmilton没有人证明这一点,因为没有人证明单独使用RSA签名或RSA加密是安全的。我不知道有条件的假设是假设两者都是安全的,但它们很可能存在。 PKCS#1(编码RSA的标准)说,不建议对两者使用相同的密钥,并且这样做“对于保持可证明的安全性可能[不是必需的]”,但是并没有禁止它,并说不是“任何已知的不良互动”。考虑到同时使用这两种方法会加剧攻击,因此有点夸张,PKCS#1确实提到了,我的回答也应该如此。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
19年5月17日在17:47
#2 楼
简短的答案:否,这不安全,请不要这样做。
更长的答案:
您确实可以将RSA密钥对用于这两种操作。在许多应用程序和方案中都使用此方法。有Web Services或Single Sign-On实施,它们使您必须对两个操作使用相同的密钥对。 X.509证书不允许您(默认情况下)确定是否必须将给定的RSA密钥用于加密/解密或签名/验证。可以仅使用特定的扩展名或证书字段来强制执行此操作,而这些扩展名或证书字段不是强制性的...
但是,在密码学中,对于两个操作使用相同的密钥通常是非常不好的做法。例如,如果其中一个操作遭到破坏,则可能破坏使用同一密钥的其他操作的安全性。
RSA密钥设置中有一个实际示例。想象一下,一个服务器使用RSA密钥解密密文并签署消息。想象一下,此服务器容易受到特定的选择密文攻击(Bleichenbacher攻击),该攻击使对手可以在不知道服务器私钥的情况下解密任意密文。如果服务器使用相同的RSA密钥对进行加密/解密和签名/验证,则攻击者也可以使用此攻击创建任意服务器签名。如果服务器将不同的RSA密钥对用于这些操作,则将无法实现。
有关更多详细信息,请参见我们的论文:http://www.nds.ruhr-uni-bochum.de/ research / publications / backwards-compatibility /
第四部分讨论了公共密钥设置中的密钥重用问题。 5.3节显示了这些攻击及其影响的实际示例。 5.4和5.5节讨论了对策及其在不同供应商中的应用。
评论
$ \ begingroup $
Bleichenbacher的示例是一个不好的例子-密钥没有安全地用于加密,因此不能期望它也可以安全地用于签名。真正的原因是密钥管理。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
2013年12月5日16:10
$ \ begingroup $
用户只想知道两个操作使用相同的密钥对是否安全。我的示例显示了可能出问题的地方(不安全的算法会影响安全的算法),所以我认为这是适当的。即使,当然可能存在不同的原因,两个操作都不使用相同的密钥对...
$ \ endgroup $
–朱拉杰
2013年12月10日13:37
评论
取决于您使用的填充方案及其实现的棘手细节。通常不鼓励这样重复使用键。用私钥加密几乎没有意义,因为每个知道公钥的人都可以窥探到消息中。通常,如en.wikipedia.org/wiki/RSA_%28cryptosystem%29#Encryption中所述,使用对方公共密钥进行加密。
如果您使用相同的结构进行签名和加密,则Bob可以将哈希作为密文发送给您,供您使用私钥解密,因此您对其进行了签名,然后要求将得到的纯文本作为密码来获得有效的密码。签名。
我有一个使用同一对RSA密钥对RSA进行签名加密的方案(不使用散列),请参阅mok-kong-shen.de中我软件中的示例3S