它们似乎都是需要公钥和私钥的加密算法。为什么我会选择一个与另一个在我的客户端服务器应用程序中提供加密?
答案 0 :(得分:82)
我的旧答案似乎不对
答案 1 :(得分:24)
顺便说一下,你不能用DSA加密,只能签名。虽然它们在数学上是等效的(或多或少),但您不能在实践中将DSA用作加密方案,仅作为数字签名方案。
答案 2 :(得分:23)
RSA
RSA加密和解密是可交换的
因此它可以直接用作数字签名方案
给出RSA方案{(e,R),(d,p,q)}
签署消息M,计算:
S = M次幂d(mod R)
验证签名,计算:
M = S power e(mod R)= M power 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 power(p-1)/ q
对于任何h1
然后每个用户选择一个私钥并计算他们的公钥:
选择x
计算y = g功率x(mod p)
DSA密钥生成与El Gamal相关,但有点复杂。
主要是因为使用二次160位模数q来帮助
加速计算并减小结果签名的大小。
DSA签名创建和验证
签署消息M
生成随机签名密钥k,k
计算
r =(g power 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则验证签名
使用a,签名创建再次类似于ElGamal
每个消息临时签名密钥k,但是做第一个mod的mod,
然后mod q减小结果的大小。注意使用
哈希函数SHA在这里是显式的。验证也包括
比较两个计算,再次比一个更复杂,
但与El Gamal有关。
请注意,几乎所有的计算都是mod q和
因此要快得多。
但是,与RSA相比,DSA只能用于数字签名
DSA安全
潜意识信道的存在存在于许多方案中(任何需要选择随机数的方案),而不仅仅是DSA。它强调了对系统安全的需求,而不仅仅是一个好的算法。
答案 3 :(得分:20)
参考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的一个很好的概述。
答案 4 :(得分:6)
除了以上不错的答案。
RSA代表Ron R ivest,Adi S hamir和Leonard A dleman。