使用 DSA 密钥是否存在安全风险?
您误读了有关嗅探数据包的页面;它已经是偏执和危言耸听,但还没有到那个地步。
在生成DSA 签名时,签名引擎在一个组中工作,该组由模p(一个大素数)和一个组阶q(一个较小的素数,p-1的除数)体现。这些值是公钥的一部分。对于每个签名,签名引擎必须使用随机数生成器生成随机值k,必须在1..q-1范围内统一选择。“统一”一词非常重要。如果k的选择有偏差,那么它允许在观察多个签名后恢复密钥。这是否重要取决于偏见。相对较小的偏差(例如k生成为大小为q的位序列,然后减少模q )将在大约2 63 个签名后导致密钥恢复的“学术”中断:攻击,是的,但不实用。另一方面,如果随机生成器非常糟糕以至于它总是为k输出相同的值,那么两个签名就足以重新计算私钥。索尼部署了这样一个完全失败的 RNG/签名系统。
这相当于如果签名算法的实现是伪造的,那么它可能会泄露重要数据,包括私钥。任何加密算法都是如此,RSA 也不例外。挑出 DSA 是没有根据的。
(完全中立的说法是,DSA 和 ECDSA 要求每个签名都有一个随机源,这对于智能卡等嵌入式系统来说是一个相对较重的要求。解决方案是存在的;当我有时间时,我会处理这个问题。编辑:这是现在已发布的 RFC。)
至于密钥大小,当前标准指定大小为 1024、2048 和 3072 位(即p的大小)。该标准的旧版本只允许 1024 位,而更旧的版本则允许从 512 到 1024 位的所有大小的 64 倍数。许多已部署的 DSA 实现有点落后于 2009 标准,因此仅允许 1024 位密钥。
1024 位 DSA 密钥不是重大风险。据我们所知,DSA 似乎至少与具有相同密钥大小的 RSA 一样强大,并且在实践中更强大一些。DSA 依赖于离散对数,当前的 DL-break 记录为 530 位,而当前的因式分解 (RSA) 记录为 768 位。最知名的因式分解和 DL 算法有很多相似之处,但最后一步(需要大量快速 RAM)使用 DL 似乎比使用因式分解更昂贵。因此,目前,1024 位 DSA 密钥并不是真正的安全风险。特别是因为对于签名,与加密相比,我们不必担心未来的破解;并且 DSA 是仅签名的。
DSA 的主要问题是它不像 RSA 那样被广泛支持。当它被支持时,它可能会受到限制(例如,仅限于 1024 位密钥,或者只能与一组有限的其他加密算法结合使用)。这些限制不是算法固有的,而是反映了由 RSA 主导的市场状况。然而,目前切换到DSA 的椭圆曲线变体非常流行,相应地,市场正在缓慢(非常缓慢)转向对 (EC)DSA 的更多支持。
看你的两个问题:
使用错误的 RNG 会泄露私钥
这是通常描述和实现 DSA 的方式的问题,但不是 DSA 的固有问题。您可以确定性地实施 DSA,避免此问题。
我认为这是典型实现中的一个缺陷,应该修复。但显然那些从事这些实现工作的人不同意,或者想要遵循一些有缺陷的标准程序。无论您使用哪种加密货币,RNG 损坏的系统都是一个大问题。例如,它通常会完全破坏您加密连接的机密性,因为会话密钥是错误的。不惜一切代价避免使用这些系统。
Matthew Green 写了一篇关于坏 RNG 导致的问题的博文:在坏 RNG 中幸存下来
DSA 限制为 1024 位
一些较旧的标准 (FIPS 186-2) 要求使用 1024 位密钥,并且某些实现可能仅限于该大小。但是较新的标准 FIPS 186-3 允许它们,并且许多实现支持 2048 位密钥。
所以我认为这不再相关了。
如果这些说法属实,我看不出有任何理由使用 DSA 密钥 [通过 RSA 密钥]
几乎没有理由在 RSA 上使用有限域 DSA。它们在相似的安全级别上具有相似的性能。但是 ECDSA 是椭圆曲线上的 DSA,在高安全级别上提供了更好的性能(至少对于签名而言)。所以使用它是有原因的,尽管它对损坏的 RNG 很弱。