看起来它们都是需要公钥和私钥的加密算法。为什么我会选择一个而不是另一个来在我的客户端服务器应用程序中提供加密?
5 回答
在下面查看AVA 的答案。
我的旧答案似乎是错误的
RSA
RSA 加密和解密是可交换的
,因此它可以直接用作数字签名方案
,给定 RSA 方案 {(e,R), (d,p,q)}
对消息 M 进行签名,计算:
S = M power d (mod R)
验证签名,计算:
M = S power e(mod R) = M power ed(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,一个 160 位素数因子p-1
为任何 h<p-1, h(p-1)/q(mod p)>1
选择 g = h power (p-1)/q
然后每个用户选择一个私钥并计算他们的公钥:
选择 x<q
计算 y = g 幂 x(mod p)
DSA 密钥生成与 El Gamal 相关,但比 El Gamal 复杂一些。主要是因为使用了辅助 160 位模数 q 来帮助加快计算并减小生成的签名的大小。
DSA 签名创建和验证
对消息 M 进行
签名生成随机签名密钥 k,k<q
计算
r = (g power k(mod p))(mod q)
s = k-1.SHA(M)+ xr (mod q )
发送签名 (r,s) 和消息
以验证签名,计算:
w = s-1(mod q)
u1= (SHA(M).w)(mod q)
u2= rw(mod q)
v = ( g power u1.y power u2(mod p))(mod q)
如果 v=r 则验证签名
签名创建再次与 ElGamal 类似,使用每个消息的临时签名密钥 k,但先进行 calc 计算 mod p,然后 mod q 以减小结果的大小。请注意,哈希函数 SHA 的使用在这里是明确的。验证还包括比较两个计算,同样比 El Gamal 复杂一点,但与 El Gamal 相关。
请注意,几乎所有计算都是 mod q,因此要快得多。
但是,与 RSA 相比,DSA 只能用于数字签名
DSA 安全
性 阈下通道的存在存在于许多方案中(任何需要选择随机数的方案),而不仅仅是 DSA。它强调需要“系统安全”,而不仅仅是一个好的算法。
顺便说一句,你不能用 DSA 加密,只能签名。尽管它们在数学上是等效的(或多或少),但实际上您不能将 DSA 用作加密方案,而只能用作数字签名方案。
参考man ssh-keygen
,DSA 密钥的长度被限制为正好 1024 位,以保持符合 NIST 的 FIPS 186-2。尽管如此,理论上更长的 DSA 密钥是可能的。FIPS 186-3 明确允许它们。此外,1024 位长的 RSA 或 DSA 密钥不再保证安全性。
总之,2048 位 RSA 密钥是目前最好的选择。
更多注意事项
建立安全的 SSH 连接不仅仅需要选择安全的加密密钥对技术。鉴于爱德华·斯诺登 (Edward Snowden) 的 NSA 爆料,人们必须比以前认为的足够警惕。
仅举一个例子,使用安全的密钥交换算法同样重要。这是当前最佳 SSH 强化实践的一个很好的概述。
除了上面的好答案。
- DSA 使用离散对数。
- RSA 使用整数分解。
RSA 代表 Ron Rivest、Adi S hamir和 Leonard A dleman。