概述

  RSA算法是第一个能用于加解密和数字签名的非对称加密算法。RSA的命名是以其提出者姓氏的首字母组合而成,Ron Rivest、Adi Shamir和Leonard Adleman。关于RSA的小小插曲,1983年麻省理工学院在美国为RSA算法申请了专利。这个专利2000年9月21日失效。由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。最近正好在学习知识产权法,正好顺便可以复习一下。回到正题,密码分析人员对RSA算法的安全性无法证明,所以也不能否认它的安全性。


预备知识

在非对称密码学中,密钥被分为两类,公钥和私钥。公钥和私钥中的一方都可以作为公开的一

方,通过某种方式公开传递给对方,而另一方进行妥善的保管,作为私有的密钥。发送方可以用人人皆知的接收方公开密钥对发送的信息进行加密,安全的传送给接收方,然后由接收方用自己的私有密钥进行解密。非对称加密方式可以使通信双方无须事先交换密钥就可以建立安全通信,广泛应用于身份认证、数字签名等信息交换领域。

若整数g和n互素,则gj(n) ≡ 1(mod n);其中j(n)为比n小,但与n互素的正整数个数,称为j(n)为欧拉函数。

  按照我的理解是,如果n为素数,则j(n)=(n-1);否则,n=pq,j(n)=(p-1)(q-1),其中p,q互素。在这里就有一个让我从小就没想明白的问题1究竟是不是素数,1和其他数是否互为素数。所以我暂且就是按照我的理解来计算的j(n)。

j(n)的时候,就必须考虑的一点是,选择的p,q不要是1,不然计算就会很悲剧了。而在实际的RSA算法中,是随机选择两个互素的数p,q来计算公钥和私钥的。


算法描述

RSA的算法描述如下:

  1. 选取两个大的互异素数p和q
  2. 计算n=p*q,j(n)=(p-1)(q-1)
  3. 选择整数e使gcd(j(n),e)=1 ,1<e<j(n),(gcd(a,b)表示非负整数a,b的最大公因子).公钥Pk={e,n}
  4. 计算d,使得de = 1 (modj(n)).私钥Sk={d,p,q}

对明文m, 1<m<n, 加密后的密文为 c = me(mod n)

  解密变换:对密文c, 1<c<n, 解密后的明文为 m = cd(mod n)

  补充说明:一开始在理解RSA算法的时候,并不能理解的是欧拉定理在RSA算法中的作用究竟是什么。实践说明,没有经过计算,只是一直看一直观察是得不出结论的。所以,我进行了一系列的计算,发现了RSA算法的解密过程是需要用到欧拉定理的。我在开始看的时候只是把它当成一个公式来看待的所以没有发现这一点。  

首先我们来看加密的过程:c = m^e(mod n)
接着是解密了,可以经过下列的步骤得到明文m = c^d(mod n):
c^d = m^(e*d) (mod n) = m^(k*j(n) + 1) (mod n) = m*m^(k*j(n))(mod n)
根据欧拉定理可以知道,m^j(n) = 1 mod n
所以上面的式子c^d = m (mod n) ,继而可以得到m = c^d (mod n).




举例说明

我用了安全概论老师PPT中的一个例子进行计算,来体现RSA算法的计算过程。

  • 设p=7,q=17
  • n=7*17=119;φ(n)=(7-1)(17-1)=96;
  • 选择e=7,gcd(7,96)=1;得到公钥Pk={7,119};
  • 计算d,( d*e) mod 96=1; d=55;得到 私钥Sk={55,7,17};

设:明文m=19

加密:  19^5 mod 119 = 26

解密:   26^55 mod 119 = 19

到这里,就把RSA的计算过程走了一遍。


RSA算法的安全性

RSA算法的安全性是依赖于大数分解的。所以一般认为只要n足够大,密码攻击者就没有办法对其进行破解了。