我经常看到 RSA 被推荐为一种密钥交换方法。但是,Diffie-Hellman 密钥交换方法似乎也是安全的。
是否有任何考虑因素会导致使用一种算法而不是另一种算法?
我经常看到 RSA 被推荐为一种密钥交换方法。但是,Diffie-Hellman 密钥交换方法似乎也是安全的。
是否有任何考虑因素会导致使用一种算法而不是另一种算法?
情况可能会很混乱,所以让我们把事情做好。
RSA是两种算法,一种用于非对称加密,一种用于数字签名。这是两种截然不同的野兽;尽管它们共享相同的核心数学运算和密钥格式,但它们以不同的方式做不同的事情。Diffie-Hellman 是一种密钥交换算法,它是另一种算法。由于算法不做同样的事情,您可以根据使用上下文更喜欢其中一个。
非对称加密和密钥交换在某种程度上是等价的:使用非对称加密,您可以通过生成随机对称密钥(一堆随机字节)并使用接收者的公钥对其进行加密来进行密钥交换。相反,您可以通过密钥交换进行非对称加密,方法是使用密钥交换产生的密钥使用对称算法加密数据,例如AES。此外,Diffie-Hellman 是一种单程密钥交换算法:接收者发送他的一半(“DH 公钥”),发送者计算他的一半,获取密钥,加密,将全部发送给接收者,接收者计算密钥, 解密。这与一次性通信系统兼容,假设预先分发了公钥,即它适用于电子邮件。
所以对于这个答案的其余部分,我假设我们正在谈论 RSA加密。
完美前向保密是一个很好的特性,可以概括为:实际加密是使用我们不随身携带的密钥完成的,因此不会受到不可告人的盗窃。这仅适用于我们不希望保持数据加密的设置,即不适用于电子邮件(电子邮件应在邮箱中保持加密),但适用于SSL/TLS等数据传输。
在这种情况下,要获得 PFS,您需要为实际加密生成一个临时密钥对(非对称加密或密钥交换);由于您通常还需要某种身份验证,因此您可能至少在一侧需要另一个非瞬态密钥对。这就是使用“DHE”密码套件在 SSL 中发生的情况:客户端和服务器使用 DH 进行密钥交换,使用新生成的 DH 密钥(未存储),但服务器还需要用于签名的永久密钥对(RSA 类型, DSA,ECDSA...)。
没有什么本质上禁止生成临时 RSA 密钥对。事实上,旧版本的 SSL 支持这一点。参见TLS 1.0,第 7.4.3 节。在这种情况下,强制使用临时 RSA 密钥不是为了 PFS,而是完全相反:这样即使服务器的永久密钥太大而无法如此粗暴,加密密钥虽然没有存储,但之后可能会被破坏。
然而, DH 在生成临时密钥方面比 RSA 有一个优势:生成新的 DH 密钥对非常快(假设某些“DH 参数”,即计算 DH 的组被重用,这并不需要据我们所知,额外的风险)。对于大型服务器来说,这并不是一个非常严重的问题,因为一个非常繁忙的 SSL 服务器可以每十秒生成一个新的“临时”RSA 密钥对,而只占用他很小一部分的计算能力,并且只将其保存在 RAM 中,并且仅用于十秒,这已经足够 PFSish 了。
然而,短暂的 RSA 已经过时,更重要的是,已经过时了。在 SSL 的上下文中,如果您想要 PFS,则需要使用临时 DH(又名“DHE”),因为这是现有实现定义和支持的。
如果您不想要 PFS,特别是如果您希望能够窃听您自己的连接或您的病房的连接(在系统管理员通过某些过滤器保护他的用户的上下文中,或进行一些调试活动),您需要非临时密钥。同样,可以使用 RSA 和 DH。但是,仍然在 SSL 的上下文中,非临时 DH 要求服务器的密钥在其 X.509 证书中包含 DH 公钥。
在 RSA 获得专利的日子里,美国联邦政府推动了证书中的 DH 公钥。但这些日子早已一去不复返了。此外,DH 支持从来没有像 RSA 支持那么广泛。这确实是一个有趣的例子:DH 得到了政府的批准,并由机构标准化(如ANSI X9.42);另一方面,RSA 是由一家私人公司标准化的,该公司无权以任何方式制定标准。但是RSA 标准(PKCS#1) 任何人都可以免费阅读,虽然有专利,但它只在美国有效,在世界其他地方无效;在美国,RSA(该公司)分发了该算法的免费实现(只要用于非商业用途,就免费)。因此,包括 PGP 的 Phil Zimmerman 在内的业余开发人员使用的是 RSA,而不是 DH。标准的价格对公司来说不算什么,但对个人来说意义重大。这证明了软件行业可以来自业余爱好者的推动力。
所以这是 RSA 相对于 DH 的优势之一:标准是免费提供的。
为了安全性,RSA(或多或少)依赖于整数分解的难度,而 DH(或多或少)依赖于离散对数的难度。它们是不同的问题。碰巧最有名的破解算法是通用数域筛的变体,所以它们都具有相同的渐近复杂度。从高层次的角度来看,1024 位 DH 密钥在密码分析方面与 1024 位 RSA 密钥一样强大。
但是,如果您查看细节,您可能会注意到 GNFS 的最后一部分,即“线性代数”部分,在大密钥的情况下是瓶颈,而在 RSA 的情况下更简单。那部分是关于减少一个非常大的矩阵。在 RSA 的情况下,矩阵元素只是位(我们在GF(2)中工作),而对于 DH,矩阵元素是对大素数p取模的整数。这意味着 DH 的矩阵比 RSA 大一千倍。由于矩阵大小是瓶颈,我们可以说 DH-1024比 RSA-1024更强。
所以这是 DH 的另一个优势:可以说它比相同大小的RSA 密钥提供了一些额外的鲁棒性。
仍然为了安全起见,DH 泛化了其他组,例如椭圆曲线。椭圆曲线上的离散对数与模一个大素数的离散对数不是同一个问题;GNFS 不适用。所以不是一种Diffie-Hellman,而是几种算法。“加密多样性”是一件好事,因为它使我们能够切换算法,以防某些研究人员找到一种轻松破解某些算法的方法。
至于性能:
如果您在受限情况下设计协议(例如涉及智能卡和红外 I/O 或任何类似的低功耗),ECDH可能比 RSA 更有吸引力。
摘要:基于互操作性限制,您通常会更喜欢 RSA 而不是 DH,或者 DH 而非 RSA:根据上下文,一个会比另一个更受支持。性能很少重要(至少不像通常假设的那么重要)。对于 SSL,您将需要 DH,因为它实际上是 DHE,并且由于 PFS,“E”(作为短暂的)很高兴拥有。
DH 临时密钥交换提供了完美的前向保密性,而 RSA 单独没有。这意味着即使长期密钥在以后泄露,单个连接的会话密钥也不会受到损害,即使捕获了完整的数据流也是如此。
在 SSL 多项式的上下文中是正确的:(EC)DHE 套件使用 Diffie-Hellman 的临时密钥交换。由于服务器在使用后很快忘记了用于交换的私钥,因此服务器长期密钥的妥协不允许攻击者解密所有过去的通信,即它提供了完美的前向保密。
我建议在 SSL 中使用 ECDHE_RSA 套件。它们提供完美的前向保密性、高安全级别的机密性(如果使用 P256,则为 128 位),并允许您对传统 RSA 连接和强 ECDHE_RSA 连接使用相同的证书。
协议设计者使用 DH 进行临时密钥交换的原因是性能。
生成 DH 密钥相对便宜:它只是具有固定基数的标量乘法(如果使用乘法符号,则为指数)。
使用 ECDH 进行临时密钥交换的总成本是一次与固定基数(密钥生成)的标量乘法和一次与变量(实际密钥交换)的标量乘法以及使用长期密钥签署的 RSA 私钥操作临时公钥。
生成 RSA 密钥的成本要高得多,因为您需要找到两个大素数。为每个连接生成一个新的 RSA 密钥对非常昂贵。
RSA 私钥操作也比具有相同安全级别的 DH 密钥交换贵一点,但这并没有阻止我们使用 RSA 和长期密钥。
使用 ECC,性能差距变得更大,尤其是在更高的安全级别下。256 位 ECC 非常常见(128 位安全性),对于使用 RSA 的等效安全性,您需要一个 3000 位密钥。
相反,RSA 密钥交换涉及服务器的秘密 RSA 密钥,而 (EC)DH 不涉及。
这意味着即使攻击者获得了破解您的 RSA 密钥的方法,他也将不得不为每个服务器/密钥付出破解工作。对于 (EC)DH,使用类似 logjam 的攻击,大部分破解工作都用于破坏整个所谓的代数/椭圆群。在那之后,断开单个连接是便宜的。
因此,虽然 RSA 密钥交换促使攻击者仅破解感兴趣服务器的密钥,但 (EC)DH 密钥交换促使他攻击尽可能多的连接以获得最佳成本/攻击比。
如果您想知道,为什么 (Im)perfectForwardSecrecy 的这个属性鲜为人知,这可能是因为目前尚不知道针对椭圆曲线 Diffie-Hellman 密钥交换的类似 logjam 的攻击。
这应该是发布https://security.stackexchange.com/a/35472/185953的后续/评论