看起来它们都是需要公钥和私钥的加密算法。为什么我要在客户端服务器应用程序中选择其中一种提供加密?
看起来它们都是需要公钥和私钥的加密算法。为什么我要在客户端服务器应用程序中选择其中一种提供加密?
请查看下面AVA的答案。
我的旧回答似乎是错误的。
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次方
对于任何h < p-1,h(p-1)/q(mod p)>1
然后每个用户选择一个私钥并计算其公钥:
选择x < q
计算y = g的x次方(mod p)
DSA签名创建和验证
对于签署消息M:
生成随机签名密钥k,其中0 < k < q
计算
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的u1次方.y的u2次方(mod p))(mod q)
如果v=r,则签名已验证
签名创建与ElGamal类似,使用每个消息的临时签名密钥k,但首先进行mod p,然后进行mod q以减小结果的大小。请注意,在此处显式使用哈希函数SHA。验证还包括比较两个计算,与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密钥不再能保证安全。ssh-keygen
也允许使用其他位数的密钥(我自己在 RHEL 上使用 ssh-keygen
生成了一个 2048 位的 DSA 密钥)。 - Samveen除了上面的好回答之外。
RSA代表Ron Rivest,Adi Shamir和Leonard Adleman的名字的首字母。