RSA算法

RSA算法既可以用于加密,也可用于数字签名。

 

1.密钥的产生

1)选两个安全的大素数p和q (安全 就要足够大 一般1024位->2^1024的大小)

2)计算n=p*q,Φ(n)=(p-1)*(q-1).Φ(n)是欧拉函数值。   注意:Φ(n)一定要保密

3)选一正整数e,这个e要满足1<e<Φ(n)且gcd(Φ(n),e)=1。Φ(n)与e是互素的

4)找一正整数d,这个d是根据e*d=1 mod Φ(n)(d是e在模Φ(n)下的乘法逆元,因为e与Φ(n)互素,由模运算可知它的逆元一定存在且唯一)

5)公钥对{e,n} 私钥对{d,n}

2.加密

加密时首先将明文比特串分组,使得每个分组对应的十进制数小于n,即分组长度小于log2n。然后对每个明文分组m,作加密运算:

C=Me mod n

3.解密

M=Cd mod n

 

证明RSA算法中解密过程的正确性:(也就是证明解密文能得到原文)

证明:m与n互素,由加密过程可知 C=Me mod n

所以Cd mod n=Med mod n=MkΦ(n)+1 mod n

由欧拉定理可得 MΦ(n)=1 mod n,即MkΦ(n)=1 mod n,MkΦ(n)+1=M mod n

Cd mod n=M mod n

 

RSA算法的安全性

整数分解问题:已知m是两个大素数的乘积,求n的素分解

至今还未能证明分解大整数就是NPC问题,也许有尚未发现的多项式时间分解算法

随着人类计算能力的不断提高,原来被认为是不可能分解的大数已被成功分解

 RSA的安全性基于数论中大整数分解的困难性

因为如果RSA的模数n被成功地分解为p×q,则获得中Φ(n)=(p-1)(q-1),从而攻击者能够从公钥e解出私钥d,即d= e-1 mod(n),攻击成功

 

 

RSA存在很多种攻击,并不是因为算法本身存在缺陷,而是由于参数选择不当造成的,为保证算法足够安全,参数须满足下面几个基本要求:

1.需要选择足够大的素数|p-q|较大,且(p-1)和(q-1)没有小的素因子

2.通常选择小的加密指数e,且与Φ(n)互素,e对所有用户可以是相同的,最初建议使用e=3,现在3太小,常使用e-216-1=65535

3.解密指数比较大

4.不同用户不共用模数

5.系统不随意对信息进行解密

 

RSA中的计算问题:

1.RSA的加密与解密的模幂运算

RSA的加密、解密过程都为求一个整数的整数次,再取模。如果按其含义直接计算,则中间结果非常大,有可能超出计算机所允许的整数取值范围。

使用模运算的性质:( axb ) mod n = [ ( a mod n ) x ( b mod n ) ] mod n  可以减小中间结果

2.模幂运算的快速算法

例如:求x16,直接计算的话需做15次乘法。

然而如果重复对每个部分结果做平方运算即求x,x2,x4,x8,x16则只需4次乘法。

求at可如下进行,其中a,t是正整数:将t表示为二进制形式bk,bk-1,...b0,即t=bk2k+bk-12k-1+...+b12+b0

所以 at=((((abk)2abk-1)2)...ab1)2ab0

posted @ 2020-07-07 19:10  SjYu  阅读(783)  评论(0编辑  收藏  举报