RSA算法

来源:互联网 发布:网络测网速 编辑:程序博客网 时间:2024/05/21 22:21

http://www4.zzu.edu.cn/rgb6/ShowMht.aspx?Type=1&ID=76


RSA算法需要以下相关的数学概念:


  素数:素数是一个比1大,其因子只有1和它本身,没有其它数可以整除它的数。素数是无限的。例如,2,3,5,7……等。


  两个数互为素数:指的是它们除了1之外没有共同的因子。也可以说这两个数的最大公因子是1。例如,4和9,13和27等。


  模运算:如A模N运算,它给出了A的余数,余数是从0到N-1的某个整数,这种运算称为模运算。


RSA加密算法的过程如下:
(1)取两个随机大素数p和q(保密)
(2)计算公开的模数r=pq(公开)
(3)计算秘密的欧拉函数 (r) =(p-1)(q-1)(保密),两个素数p和q不再需要,应该丢弃,不要让任何人知道。
(4)随机选取整数e,满足gcd(e,  (r))=1(公开e,加密密钥)
(5)计算d,满足de≡1(mod  (r))(保密d,解密密钥,陷门信息)
(6)将明文x(其值的范围在0到r-1之间)按模为r自乘e次幂以完成加密操作,从而产生密文y(其值也在0到r-1范围内)
y=xe (mod r)
(7)将密文y按模为r自乘d次幂,完成解密操作
x=yd (mod r)


  下面用一个简单的例子来说明RSA公开密钥密码算法的工作原理。


  取两个素数p=11,q=13,p和q的乘积为n=p×q=143,算出秘密的欧拉函数Phi(n)=(p-1)×(q-1)=120,再选取一个与Phi(n)=120互质的数,例如e=7,作为公开密钥,e的选择不要求是素数,但不同的e的抗攻击性能力不一样,为安全起见要求选择为素数。对于这个e值,可以算出另一个值d=103,d是私有密钥,满足e×d=1 mod (n),其实7×103=721除以120确实余1。欧几里德算法可以迅速地找出给定的两个整数a和b的最大公因数gcd(a,b),并可判断a与b是否互素,因此该算法可用来寻找解密密钥。


(n,e) 这组数公开,(n,d)这组数保密。
  设想需要发送信息x=85。利用(n,e)=(143,7)计算出加密值:
y= xe (mod r)=857 mod 143=123
收到密文y=123后,利用 (n,d)=(143,103)计算明文:
x=yd (mod r) =123103mod 143=85
加密信息x(二进制表示)时,首先把x分成等长数据块 x1 ,x2,..., xi ,块长s,其中 2s ≤ n,s尽可能的大。对应的密文是:
yi = xie ( mod r )


  解密时作如下计算:
xi = yid ( mod r )


RSA算法中的难点有以下几点:
(1)大数的运算
上百位大数之间的运算是实现RSA算法的基础,因此程序设计语言本身提供的加减乘除及取模算法都不能使用,否则会产生溢出,必须重新编制算法。在编程中要注意进位和借位,并定义几百位的大数组来存放产生的大数。
(2)素数的产生
Hadamard证明,当X变得很大时,从2到X区间的素数数目π(X)与X/ln(X)的比值趋近于1,即:
   如果在2到X之间随机选取一个整数,其为素数的概率大约为1/ln(X)。对于1024位的模数r=pq,p和q将选取为512位的素数。一个随机选取的512位整数为素数的概率大约为1/ln2512 1/355。
目前,适用于RSA算法的最实用的素数生成办法是概率测试法。该法的思想是随机产生一个大奇数,然后测试其是否满足一定的条件,如满足,则该大奇数可能是素数,否则是合数,经过充分多次运行该算法,把合数判断为素数的概率可以降低到任何所期望的值以下。如solovay和strassen的简明素性概率检测法。目前也存在多项式时间的确定性算法来判断一个数是否为素数。
(3)高次幂剩余的运算
  要计算x^e mod r,因x、e、r都是大数而不能采用先高次幂再求剩余的方法来处理,而要采用平方取模的算法,即每一次平方或相乘后,立即取模运算。设e可表示为:
e = bk^2k + bk-1 2k-1 + ... + bi 2i + ... + b2 22 + b1 2 + b0
   = (…((bk 2 )+ bk-1)* 2+…+)bi*2
xe =x(…((bk 2 )+ bk-1)* 2+…+)bi*2 = ((x bk )2* xbk-1)2
例:
 4的5次方运算 = 4^5 = 42^2+2^0 =(42*1)2*4,  再运用模的性质:(a*b)mod(m)=(a mod (m)*b mod(m)) mod(m), 所以(4^5)mod (m)可先化为(((4)^2*1)^2*4)mod(m),再化为(((4)^2 mod (m)*1)^2 mod(m)*4)mod(m).举例子--(4^5)mod(3)=(((4)^2*1)^2*4)mod(3)=((1*1)^2mod(3)*4)mod(3)=(1*4)mod(3)=1.
a^19=(a^2)*bk*)


  那么有如下的计算x^e算法:
Square-and-Multiply(x,e,r)
Z=1
For i=k downto 0
  z=z*z mod r
  if bi=1
     then z=z*x mod r
Return(z)

0 0
原创粉丝点击