RSA算法与DSA算法的区别
2019-03-27 09:32:02 阿炯

当我们在Linux/Unix系统(windows下需用git的bash工具或xshell)中通过生成ssh认证密钥时,你要(用-t type来)选择创建一对RSA或者DSA密钥。这两者之间有什么区别,是什么原因让人们选择其中一个而不选另外一个,在正式开始介绍之前先讲一讲数字签名算法。

数字签名就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。一般是非对称密钥加密技术与数字摘要技术的结合应用,目前在数字签名中使用的三种非对称算法有:RSA、DSA、ECDSA。

SSH使用不同加密算法生成的密钥。使用SSH时可以选择使用不同形式的加密,有点类似于为WiFi选择不同加密方法的能力(WPA2,WPA,WEP等)。

SSH使用公钥加密,这意味着当您连接到SSH服务器时,它会广播一个公钥,您可以使用该公钥加密要发送到该服务器的更多流量。如果服务器配置为使用RSA,则它将是RSA算法生成的密钥。计算机会从中列出的密钥文件中发回自己的公共RSA密钥,服务器需要此密钥才能连接并回复。

计算机上存在所有三个密钥,因为您连接的任何给定SSH服务器可能配置为使用这些算法中的任何一种。计算机将发回一个与服务器使用的类型相匹配的唯一密钥,密钥已通过相同的算法在客户计算机上生成。

SSH服务器只需要一个,而客户端只需要支持一种类型的密钥用于Ssh连接。

RSA,DSA,ECDSA,EdDSA,Ed25519全部用于数字签名,但只有RSA也可用于加密。

RSA ( Rivest-Shamir-Adleman )是第一个公钥密码系统,广泛用于安全数据传输。它的安全性依赖于整数分解,因此永远不需要安全的RNG。与DSA相比,RSA更快地进行签名验证,但生成速度较慢。

DSA (数字签名算法)是数字签名的联邦信息处理标准。它的安全性依赖于离散对数问题。与RSA相比,DSA更快地生成签名,但验证速度较慢。如果使用了错误的数字生成器,可以打破安全性。

ECDSA (椭圆曲线数字签名算法)是DSA的椭圆曲线实现(数字签名算法)。椭圆曲线加密能够提供与具有较小密钥的RSA相对相同级别的安全级别。它还有一个缺点,即DSA对不良RNG敏感。

EdDSA ( Edwards-curve数字签名算法)是一种使用数字签名方案的数字签名方案基于 Schnorr签名的变体Twisted Edwards曲线。签名创建在EdDSA中是确定性的,其安全性基于某些离散对数问题的难以处理性,因此它比DSA更安全。 ECDSA要求每个签名具有高质量的随机性。

Ed25519 是 EdDSA签名方案,但使用SHA-512/256 和 Curve25519 ; OpenSSH v5.7 中引入),计算上比DSA轻,但区别在于除非你的机器具有很低的处理能力,否则很明显。

自 OpenSSH 7.0 起,SSH默认情况下不再支持DSA密钥(ssh-dss)。根据SSH标准(RFC 4251和后续版本),DSA密钥用于在任何地方工作。

Ed25519在 OpenSSH 6.5 中推出。

下面就重要的签名算法做简单的介绍

DSA(用于数字签名算法)的签名生成速度很快,验证速度很慢,加密时更慢,但解密时速度很快,安全性与RSA密钥相等,而密钥长度相等。此为一些重要的话,现在是一些观点。

RSA算法(可用于加密和数字签名)的安全性基于这样的事实:大整数的因式分解 被认为是‘难以破解’ (困难的) ,而DSA安全性基于离散对数问题。今天已知用于分解大整数块的最快算法是通用数字场筛(可以理解为对简单合理筛或二次筛的改进算法),也是解决有限域中的离散对数问题的最快算法,该算法以DSA指定的大素数为模。现在,如果安全性可以被认为是平等的,那么我们当然会赞成更快的算法,但是,再一次没有明确的赢家。

RSA既可以用于签名也可以用于加密(密钥交换)。除了将公钥与密钥的地位交换一下之外,其它步骤几乎是完全一样的。发送方用自己的私钥对消息的摘要值进行“加密”,接收方使用发送方的公钥进摘要值进行“解密”,并将其与根据消息独立计算出的摘要值进行比较进行验证。如果匹配,则签名就是有效的。相比加密,RSA签名比较难懂的是分组格式化,我们常说RSA是对摘要值进行加密,其实并不一定对,在加密之会使用一个DER编码的DigestInfo结构(该结构包括HASH算法标识符+摘要值),是对这个DigestInfo结构进行加密。所有导致一般使用RSA(1204位)私钥进行加密的话,最多只能加密117字节数据,而不是128字节(1024位)。这样做的目的是用来防止攻击。假设某个HASH算法(H1)遭受灾难性破坏,有可能产生消息摘要为定值的随机消息(BTW:HASH算法也不能证明完全没有问题,只是在给定时间你产生不了相同的冲撞就认为是安全的,L)。

DSA当初的设计是用于数字签名而不用于密钥交换的算法,与DH一样的密码数学基础,即素数域上中的模幂运算,最重要的区别构造p(大素数)时要使p-1可以被另一个称作q的素数除尽。与RSA不同的是,DSA签名结果是由两个值r和s(160位)组成。

如果你的计算机安装了OpenSSL,请运行openssl speed。将看到DSA在生成签名时执行的很快,但在验证具有相同密钥长度的签名时速度要慢得多。通常来说你想要验证得(速度)更快,如果你处理的是一个已签名的文件,(而如果你的)签名只生成一次,这很好,但文件签名最终可能会被用户频繁地验证 (这就不好了,因为验证速度很慢)。

两者都支持某种形式的加密方法,开箱即用的RSA和使用EI GAMAL(一种基于Diffie-Hellman密钥交换的非对称加密算法)的DSA。DSA解密速度通常很快,但加密较慢,而RSA则相反。同样,您会希望解密速度更快,因为一个加密文档可能会被频繁解密。从商业角度来看,RSA显然是赢家,商业RSA证书比DSA证书被更广泛地部署。

ECDSA是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。

OpenSSH 7.0及以上版本默认禁用了ssh-dss(DSA)公钥算法。官方没有给出具体的解释,但其中可能有OpenSSH的DSA密钥位数生成的原因,同时生成签名时随机性差,可能会泄漏私钥,且以现在机算机的算力,DSA 1024-bit已经实际上可破解,不建议使用。