DSA 和 RSA 有啥区别?

Posted

技术标签:

【中文标题】DSA 和 RSA 有啥区别?【英文标题】:What is the difference between DSA and RSA?DSA 和 RSA 有什么区别? 【发布时间】:2011-02-19 22:19:47 【问题描述】:

看起来它们都是需要公钥和私钥的加密算法。为什么我要选择一个而不是另一个来在我的客户端服务器应用程序中提供加密?

【问题讨论】:

如henri 所述,DSA 不用于加密,仅用于签名。 What's the difference between id_rsa.pub and id_dsa.pub?的可能重复 【参考方案1】:

转介,https://web.archive.org/web/20140212143556/http://courses.cs.tamu.edu:80/pooch/665_spring2008/Australian-sec-2006/less19.html

RSA RSA加解密是可交换的 因此它可以直接用作数字签名方案 给定一个 RSA 方案 (e,R), (d,p,q) 签署消息 M,计算: S = M 幂 d (mod R) 验证签名,计算: M = S 幂 e(mod R) = M 幂 e.d(mod R) = M(mod R)

RSA 可用于加密和数字签名, 只需颠倒使用指数的顺序: 创建签名的秘密指数 (d),公共指数 (e) 任何人都可以验证签名。其他一切都是一样的。

DSA(数字签名算法) DSA 是 ElGamal 和 Schnorr 算法的变体。 它创建 320 位签名,但具有 512-1024 位安全性 再次取决于计算离散对数的难度 已经被相当广泛的接受了。 DSA 密钥生成 首先选择共享的全局公钥值 (p,q,g): 选择一个大素数 p = 2 次幂 L 其中 L= 512 到 1024 位,是 64 的倍数 选择 q,p-1 的 160 位素数 选择 g = h 幂 (p-1)/q 对于任何 h1 然后每个用户选择一个私钥并计算他们的公钥: 选择 x 计算 y = g 幂 x(mod p) DSA 密钥生成与 El Gamal 相关,但比 El Gamal 复杂一些。 主要是因为使用了辅助 160 位模 q 用来帮助 加快计算速度并减小生成签名的大小。

DSA 签名创建和验证对消息 M 进行签名 生成随机签名密钥 k, k 计算 r = (g 幂 k(mod p))(mod q) s = k-1.SHA(M)+ x.r (mod q) 发送带有消息的签名 (r,s) 以验证签名,计算: w = s-1(mod q) u1= (SHA(M).w)(mod q) u2= r.w(mod q) v = (g power u1.y power u2(mod p))(mod q) 如果 v=r 则验证签名

签名创建再次类似于 ElGamal,使用 每条消息的临时签名密钥 k,但先计算 mod p, 然后 mod q 以减小结果的大小。请注意,使用 哈希函数 SHA 在这里是明确的。验证还包括 比较两个计算,同样比, 但与El Gamal有关。 请注意,几乎所有的计算都是 mod q,并且 因此速度要快得多。但是,与 RSA 相比,DSA 只能用于数字签名

DSA 安全性 阈下通道的存在存在于许多方案中(任何需要选择随机数的方案),而不仅仅是 DSA。它强调“系统安全”的必要性,而不仅仅是一个好的算法。

【讨论】:

参考链接已损坏【参考方案2】:

检查AVA's answer below。

我的旧答案似乎是错误的

【讨论】:

这是否意味着如果要加密的数据量很大,使用 RSA 会运行得更快? 不,反过来。 DSA 的签名速度更快(这在数学上或多或少等于加密),因此如果您必须进行大量加密并经常解密,DSA 会更快。 大量数据要在客户端加密,但在服务器端只解密一次,那么 DSA 还能赢吗? DSA 不加密。重复一遍,DSA 不加密。这是一个测验:DSA 中的“S”是什么意思? @GregS RSA 能够加密与 DSA 不能加密主要是术语问题。我们将几种不同的算法称为 RSA,其中一些是签名(例如 RSA-PSS),其中一些是加密(例如 RSA-OAEP)。但是我们给基于组的加密中的每个算法一个不同的名称,称其中一种加密算法为 ElGamal 加密,并称其为一种签名算法 DSA。【参考方案3】:

除了上述不错的答案。

DSA 使用离散对数。 RSA 使用整数分解。

RSA 代表 Ron Rivest、Adi Shamir 和 Leonard Adleman。

【讨论】:

【参考方案4】:

参考man ssh-keygen,DSA 密钥的长度被限制为正好 1024 位,以保持符合 NIST 的 FIPS 186-2。尽管如此,理论上更长的 DSA 密钥是可能的。 FIPS 186-3 明确允许它们。此外,1024 位长的 RSA 或 DSA 密钥不再保证安全性。

总之,2048 位 RSA 密钥是目前最好的选择。

更多注意事项

建立安全的 SSH 连接比选择安全的加密密钥对技术需要更多。鉴于爱德华·斯诺登 (Edward Snowden) 的 NSA 爆料,人们必须比以前认为的足够警惕。

仅举一个例子,使用安全的密钥交换算法同样重要。这是对当前best SSH hardening practices 的一个很好的概述。

【讨论】:

一些旧版本的ssh-keygen 也允许使用其他位大小的密钥(我自己在RHEL 上使用ssh-keygen 生成的2048 位DSA 密钥)。【参考方案5】:

顺便说一句,你不能用 DSA 加密,只能签名。尽管它们在数学上是等价的(或多或少),但您不能在实践中将 DSA 用作加密方案,而只能用作数字签名方案。

【讨论】:

以上是关于DSA 和 RSA 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

SHA1 VS RSA:它们之间有啥区别?

公钥加密中的各种密钥有啥区别

用openssl生成的ssl证书和付费的有啥区别

JAX-RS 和 JAX-WS 有啥区别?

理解OpenSSH的RSA和DSA认证过程

OpenSSH的RSA/DSA密钥认证系统