RSA算法

RSA

以人名起的算法名。

原理:欧拉定理

准备工作

1、取两个大素数p、q

2、计算 n = p * q

3、计算欧拉函数 Z =( p - 1 ) * ( q - 1)

4、随机选取整数 e ,满足 gcd ( e, Z ) = 1

5、计算出d ,满足d * e ≡ 1 ( mod Z )

公开和保留

公钥 KU = { e , n } 私钥KR = { d , p ,q }(双方保留)

加密

C = M^e mod (n)

解密

M = C^e mod (n)

如果要发送一个M,就计算到C,发送C过去,对方解密就得到了。

1、 p = 7, q = 11
2、 n = 143
3、 z = 120
4、 选取一个与z互质的,那就 e = 43吧
5、 由阿基米德算法得到 d = 7		//  ed =1 【mod(z=120)】

平方幂算法加速

c = m^e (mod n) 其中,指数e可以化成二进制101101....这种形式,其实就是拆分来计算,这样计算的速度会高不少

RSA安全性

  • lp-ql要大
  • gcd(p-1, q-1)应该很小
  • p和q的长度相差无几
  • p-1和q-1都应有大素因子

【选择足够大的n(1024位以上),并且使得e,d之间相差不太大,也不太小

攻击RSA的三个方法

1.共模攻击

2.低指数攻击

3.选择密文攻击

是否有不通过大整数分解的其他攻击途径?

RSA优缺点

优点

•易于理解和操作,

•RSA是被研究得最广泛的公钥算法

•该算法的加密密钥和加密算法分开,使得密钥分配方便

•特别适合计算机网络环境:对于大量用户,将公钥记录住,如果想要与某个人通信,加密发出即可。

缺点

•速度太慢

•产生密钥很麻烦,受到素数产生技术的限制,因而以做到一次一密

C语言实现RSA的代码

贴上原作:RSA算法详解及C语言实现 - 新一 - 博客园 (cnblogs.com) 写的非常精简实用

#include <stdio.h>
int candp(int a,int b,int c)
{ int r=1;
b=b+1;
while(b!=1)
{
    r=r*a;
    r=r%c;
    b--;
}
printf("%d\n",r);
return r;
}
void main()
{
int p,q,e,d,m,n,t,c,r;
char s;
printf("please input the p,q: ");
scanf("%d%d",&p,&q);
n=p*q;
printf("the n is %3d\n",n);
t=(p-1)*(q-1);
printf("the t is %3d\n",t);
printf("please input the e: ");
scanf("%d",&e);
if(e<1||e>t)
{
     printf("e is error,please input again: ");
     scanf("%d",&e);
}
d=1;
while(((e*d)%t)!=1)   d++;
printf("then caculate out that the d is %d\n",d);
printf("the cipher please input 1\n");
printf("the plain please input 2\n");
scanf("%d",&r);
switch(r)
{
    case 1: printf("input the m: "); /*输入要加密的明文数字*/
            scanf("%d",&m);
            c=candp(m,e,n);
            printf("the cipher is %d\n",c);break;
    case 2: printf("input the c: "); /*输入要解密的密文数字*/
            scanf("%d",&c);
            m=candp(c,d,n);
            printf("the cipher is %d\n",m);break;
}
getch();
}

posted @ 2021-11-23 23:41  Dinesaw  阅读(332)  评论(0编辑  收藏  举报