RSA算法简介

RSA算法简介

一、 RSA算法简述

在RSA密码体制中,每个用户都拥有两个密钥:公钥PK={e,n}和私钥SK={d,n}。公钥PK={e,n}用于加密,也成为加密密钥,可以再网络、电话簿等媒体上进行公布。私钥SK={d,n}用于解密,也称为解密密钥,必须保密。每个用户把加密密钥PK公开,使得系统中任何其他用户都可以使用,而对解密密钥SK中的d必须严格保密。

二、密钥生成

1、选取两个保密的大素数p和q。(实际应用中,这两个质数越大,就越难破解。)
2、计算n=p*q。n称为RSA算法的模数。
3、φ(n) = (p-1)(q-1),其中φ(n)是n的欧拉函数值。
4、选取一个随机整数e(即加密密钥),使之满足1< e < φ(n),随机选择一个整数e,且e与φ(n) 互质。
5、计算解密密钥d,满足e*d ≡ 1 (mod φ(n))。
即e对于φ(n)的模反元素d。
所谓”模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
这个式子等价于
  e*d - 1 = kφ(n)
于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
  ex + φ(n)y = 1
这个方程可以用”扩展欧几里得算法”求解,因为e与φ(n)互素,由模运算可知他的乘法逆元一定存在。

三、可靠性

回顾上面的密钥生成步骤,一共出现六个数字:

  p
  q
  n
  φ(n)
  e
  d
这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。

那么,有无可能在已知n和e的情况下,推导出d?

  (1)e*d≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
  (2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
  (3)n=p*q。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。
可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基百科这样写道:
  “对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
  假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。
  只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。”

四、加密

加密要用公钥 (n,e)

假设将发送的明文进行比特串分组,其中一个明文组为m,对m进行加密,设c为分组谢谢m加密后的密文,加密算法为:

   m^e ≡ c (mod n)


   m^e-kn=c
  
假设公钥是 (3233, 17),m假设是65,那么可以算出下面的等式:

  6517 ≡ 2790 (mod 3233)

五、解密

解密要用私钥(n,d)

解密算法为:
   c^d ≡ m (mod n)
  

最后,我们来证明,为什么用私钥解密,一定可以正确地得到m。也就是证明下面这个式子:

  c^d ≡ m (mod n)
因为,根据加密规则
  m^e ≡ c (mod n)
于是,c可以写成下面的形式:
  c = m^e - kn
将c代入要我们要证明的那个解密规则:
  (m^e - kn)^d ≡ m (mod n)
它等同于求证(带有kn的元素一定可以被n整除所以可以去掉。)
  m^(e*d) ≡ m (mod n)
由于
  e*d ≡ 1 (mod φ(n))
所以
  e*d = hφ(n)+1
将ed代入:
  m^(hφ(n)+1) ≡ m (mod n)
接下来,分成两种情况证明上面这个式子。
(1)m与n互质。
根据欧拉定理,此时
  m^φ(n) ≡ 1 (mod n)
得到
  (m^φ(n))^h × m ≡ m (mod n)
原式得到证明。
(2)m与n不是互质关系。
此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。
以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:
  (kp)^(q-1) ≡ 1 (mod q)
进一步得到
  [(kp)^(q-1)]^h(p-1) × kp ≡ kp (mod q)

  (kp)^(e*d) ≡ kp (mod q)
将它改写成下面的等式
  (kp)^(e*d) = tq + kp
这时t必然能被p整除,即 t=t’p
  (kp)^(e*d)= t’pq + kp
因为 m=kp,n=pq,所以
  m^(e*d) ≡ m (mod n)
原式得到证明。

六、例子

将明文 05,09加密解密公钥为PK={3,33},由于n比较小,我们可以直接算出私钥。
33=11*3
φ(n)=10*2=20
私钥d=(20+1)/3=7
加密
5^3=c1 mod33
c1=26
9^3=c2 mod33
c2=3
解密
26^7=m1 mod33
m1=5
3^7=m2 mod33
m2=9

参考网页:
[1] http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html?20151007165925
[2]https://blog.csdn.net/lisheng19870305/article/details/41576803

猜你喜欢

转载自blog.csdn.net/qq_40162797/article/details/79905371
今日推荐