看来它们都是需要公钥和私钥的加密算法。为什么在我的客户端服务器应用程序中选择一个与另一个进行加密?
看来它们都是需要公钥和私钥的加密算法。为什么在我的客户端服务器应用程序中选择一个与另一个进行加密?
Answers:
引用,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 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,一个p-1的160位质数因数
选择g = h
每个
h1的幂(p-1)/ q ,
然后每个用户选择一个私钥并计算其公钥:
选择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)+ xr(mod q)
发送带有消息
以验证签名的签名(r,s),计算:
w = s-1(mod q)
u1 =(SHA(M).w)(mod q)
u2 = rw(mod q)
v =(g幂u1.y次幂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中,在许多方案(任何需要选择随机数的方案)中都存在一个阈下信道。它强调了对“系统安全性”的需求,而不仅仅是一个好的算法。
参考man ssh-keygen
,DSA密钥的长度严格限制为1024位,以保持与NIST的FIPS 186-2兼容。但是,理论上可以使用更长的DSA密钥。FIPS 186-3明确允许它们。此外,使用1024位长的RSA或DSA密钥不再能保证安全性。
总而言之,当前最好使用2048位RSA密钥。
建立安全的SSH连接不仅仅需要选择安全的加密密钥对技术。鉴于爱德华·斯诺登(Edward Snowden)的国家安全局(NSA)启示,人们必须比以前认为足够的警惕性更高。
仅举一个例子,使用安全密钥交换算法同样重要。这是当前最佳的SSH强化实践的很好概述。
ssh-keygen
允许使用其他位大小的密钥(我自己使用ssh-keygen
在RHEL上生成的2048位DSA密钥)。