📜  RSA算法和DSA之间的区别(1)

📅  最后修改于: 2023-12-03 15:34:45.009000             🧑  作者: Mango

RSA算法和DSA之间的区别

RSA算法和DSA(Digital Signature Algorithm,数字签名算法)都是常用的非对称加密算法。他们之间有何不同呢?

RSA算法

RSA算法是由三位数学家Rivest、Shamir和Adleman发明的。它是一种基于大质数分解的算法。RSA算法的安全性源于大数分解的难度,换言之,要将一个非常大的数分解质因数是一件极为困难的事情。

RSA算法用于加密和数字签名。

加密

RSA的加密其实就是将明文通过一定的算法和参数转化为密文,解密则是相反过程。加密的过程如下:

  • 选择两个不同的质数$p$和$q$,并用它们的乘积$N=p\times q$作为RSA算法的模数。
  • 找到一个小于$N$的整数$e$,让$e$与$(p-1)\times(q-1)$互质。
  • 找到一个整数$d$,使得$d$与$(p-1)\times(q-1)$的积对$e$的余数是$1$。这个$d$就是$e$的逆元。
  • 明文$M$用$e$进行加密,密文$C$的计算公式是$C\equiv M^e\pmod N$。
  • 解密的过程与加密相反,密文$C$用$d$进行解密,明文$M$的计算公式是$M\equiv C^d\pmod N$。
数字签名

数字签名是一种用于防止信息篡改的技术,数字签名的作用类似于手写签名。数字签名的过程如下:

  • 选择两个不同的质数$p$和$q$,并用它们的乘积$N=p\times q$作为RSA算法的模数。
  • 找到一个小于$N$的整数$e$,让$e$与$(p-1)\times(q-1)$互质。
  • 找到一个整数$d$,使得$d$与$(p-1)\times(q-1)$的积对$e$的余数是$1$。这个$d$就是$e$的逆元。
  • 签名者将消息$M$用自己的私钥$d$进行加密,得到签名$S$,计算公式是$S\equiv M^d\pmod N$。
  • 验证消息的接收者将签名$S$用签名者的公钥$e$进行解密,得到明文$M'$,计算公式是$M'\equiv S^e\pmod N$,并比较$M'$和原始消息$M$是否一致。
DSA

DSA是美国NIST(National Institute of Standards and Technology)发布的一种数字签名标准,采用了和RSA算法不同的技术。

DSA算法基于离散对数问题,其安全性依赖于找到离散对数的难度。离散对数问题是指,已知整数$a$, $b$和模数$p$,求出整数$x$,使得$a^x\equiv b\pmod p$,其中$p$是一个质数。

DSA算法只能用于数字签名,不能进行加密。

DSA算法的签名过程如下:

  • 首先选择一个质数$p$和一个整数$q$,保证$q$是$p-1$的一个因子。例如$p$中可以包含一个安全参数,比如说160位或者256位。
  • 选择一个整数$g$,使它的阶等于$q$。因为$g^0, g^1, ..., g^{q-1}$是模$p$的不同取值,所以$g$可以被当作打乱之后的$0, 1, 2, ..., q-1$的一个代表。此外,在我们的实现中,$g$一般选择为2或者5,因为这两个数字在模下的计算比较容易。
  • 选取一个随机数$k$,它的范围在$1$到$q-1$之间。
  • 计算$P=(x_1, y_1)$,其中$x_1\equiv g^k\pmod p$,$y_1\equiv k^{-1}(H(M)+x_1a)\pmod q$,其中$H(M)$是输入消息$M$的哈希值,$a$是私钥。
  • 对$P$的坐标($x_1$, $y_1$)进行编码,得到签名$(r, s)$,其中$r\equiv x_1\pmod q$,$s\equiv y_1\pmod q$。

DSA算法的验证过程如下:

  • 计算哈希值$H(M)$。
  • 将签名$(r, s)$解码为点$P'=(x_2, y_2)$,其中$x_2\equiv r\pmod q$,$y_2\equiv s\pmod q$。
  • 计算$w=s^{-1}\pmod q$。
  • 计算$u_1\equiv H(M)\cdot w\pmod q$,$u_2\equiv r\cdot w\pmod q$。
  • 计算点$Q=u_1G+u_2P'$,其中$G$是$y^2\equiv x^3+a_4x+a_6\pmod p$的解,等价于选择$G$作为比模$p$小的$x$的一个整除残余系表示的椭圆曲线的基点。我们的实现中一般选择$p$和$q$的哈希值作为种子,然后通过$\text{SEED}=\text{SHA1}(seed)$,以及$a_4=S(\text{SEED})$和$a_6=S(S(\text{SEED}))$的方式来生成$a_4$和$a_6$。$S$是一个伪随机函数,$y^2=x^3+a_4x+a_6$的解构成一个阶为$n$的椭圆曲线。
  • 如果$Q=\infty$,则拒绝签名;否则,比较$r\equiv x_2\pmod q$和$u_1$是否相等,如果相等则接受签名,否则拒绝签名。
总结

可以看到,RSA算法和DSA算法都是常用的非对称加密算法。RSA算法既能进行加密,也能进行数字签名,其安全性依赖于大数分解的难度;而DSA算法只能进行数字签名,其安全性依赖于离散对数问题的难度。