rsa算法是菲对称加密算法的典型,其基于的理论是寻找一个大素数是相对容易的,但分解两个大素数的相乘是很难的。
rsa算法描述:
给出两个大素数,设为q,p
n = q*p, r = (q-1)(p-1)
随机的选取与r互质的素数e作为公钥(n也是),
私钥d满足下面的要求:
ed mod(r) = 1
给定明文m,首先将其分成明文分组,每个分组的位数要小于n的位数。对于明文分组mi,由加密算法
ci=mie(mod n)
得到相应的密文分组ci。加密后的密文c由相同长度的密文分组ci组成。
解密时,由解密算法
mi=cid(mod n)
得到相应的明文分组mi。解密后的明文m由相同长度的明文分组mi组成。
例1:
p=11,q=13,n=pq=143;
r=10*12=120,取e=7;
ed mod r =1 => d=103;
公钥(e,n)即(7,143)
私钥(d,n)即(103,143)
设明文为85,
密文c= me mod n=857 mod 143=123;
发送“123”;
还原明文m=cd mod n=123103 mod 143=85.
例2:设 p=53,q=89(实际采用数字会非常大,此为举例。)则
n=pq=4717
r=(p-1)(q-1)=4576
随机选取4576的任一互素数81作为加密密钥(公钥)e,则解密密钥(密钥)为
d=e-1(mod r)=81-1(mod 4576)=113
现设待加密的消息为:
82326734532643658636,
首先,按3位数字分组,得到7个分组:
m1=823, m2=276, m3=345,…, m7=036 (注:位数不足时可在高位补0)。
第1~7个明文加密:
c1=82381 (mod 4717)=2395
c2=27681 (mod 4717)=3649
…
c6=58681 (mod 4717)=1298
c7=03681 (mod 4717)=440
解密时需用解密密钥(私钥)113进行相同的指数模运算, 即
m1=2395113(mod 4717)=823
m2=3649113(mod 4717)= 276
…
m7=440113(mod 4717)=36
则明文为:
823 267 345 326 436 586 36
破译者要解密,则需根据已知的公钥e和两个素数的乘积n来推算出私钥d。破译归结为:已知n,求其素因子p和q,再根据已知的e,则可算出私钥d。若n=21,则n=37=21。然而,若n是一个500位的大整数的话,要分解出两个素数p和q,一人花上有生之年也不可能将其算出!目前,最快的计算机也无法做到!
注:若明文m和乘积n不互为素数,就有可能出现消息暴露情况, 即
me=m (mod n)
破译者可以通过计算n与加密以后的密文c的最大公约数来分解出n,即找到p和q,继而算出私钥d。