RSA算法的原理与实现

RSA算法的原理与实现

 实验名称:

RSA算法的原理与实现

3.21实验目的:

(1)掌握经典非对称密码算法RSA的加密解密原理。

(2)编程实现RSA算法。

(3)进一步熟悉C语言或其他程序设计语言。

3.22实验环境:

硬件:运行Windows操作系统的计算机

软件:C语言或其他程序设计语言

3.23 实验原理

RSA算法是1977年由麻省理工学院的Ron Rivest,Adi Shamir 和Leonard Adleman一起提出的非对称加密算法。RSA就是由他们三人姓氏开头字母拼接而成。RSA算法是目前最有影响力的公钥加密算法,它能够抵抗现有的已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

   RSA算法给予一个十分简单的数论事实:将两个大素数想成十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密秘钥。RSA算法主要包括:秘钥生成,加密过程和解密过程。

  1)加密过程。在秘钥生成过程中,首先生成两个大的质数(素数)p和q,令n=p*q;m=(p-1)*(q-1),选取较小的数e,使e 和m互质,即e和m的最大公约数为1,然后生成d,使d*emod m=1,最后丢弃P,q,m,则公钥为e,n,私钥为d和n.

(2) 加密过程。将明文x加密成密文y的计算公式为:x=y^d mod n。从公式可见,加密牵涉到明文和公钥。因此,密文即使被截获,也无法被解读。

(3) 解密过程。将密文y解密成明文x的计算公式为:x=y^d mod n。从公式可见,解密至牵涉到私钥和密文。因此,只要保管好私钥,不泄密,就可以放心地把密文和公钥公开。

(4) 算法实例。下面给出一个算法实例。为计算方便,选择较小的质数(实际应用时不安全)。

①密钥生成。首先生成两个大的质数,p=7,q=19.计算n=p*q=133.

计算m=(q-1)*(p-1)=108。选择较小的数e=5,使e和108互质。然后生成d,使d*e mod n=1,计算得到d=65,至此,公钥e=5,n=133,私钥d=65,n=133.密钥计算完毕。

②加密过程。RSA的原则是明文应该小于p和q的较小者。所以,明文x可取值6.计算密文:y=x^e mod n=65^5 mod 133=62.

③解密过程。计算明文:x=y^d mod n=62^65 mod 133=6.

3.24 实验内容

依据上述实验原理,编程实现RSA密码算法。

RSA密钥生成算法具体如下:

(1)随机选取两个素数,作为p和q.

(2)计算n=q*p,m=(q-1)*(p-1);

(3)随机选取e,使e 与m互质.

(4)利用扩展欧几里得算法,计算d使d*e mod m=1.

(5)得到公钥(e,n)和私钥(d,n)。

RSA加密算法具体如下:

(1)输入明文x(数字)

(2)利用模运算的性质,计算密文y=x^e mod n。

RSA解密算法具体如下:

(1)输入密文y(数字)。

(2)利用模运算的性质,计算密文x=y^d mod n。

实验完成后要编写实验报告。实验报告包括实验目的,实验内容,基本原理,程序设计(如流程图),程序实现(如相关数据结构,函数定义等),测试运行结果,并提交实验报告附件(包括源程序文件和可执行文件)。

程序代码:

#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--;  

}  

return r;  

}  

int main()  

{  

int p,q,m,n,e,d,x,y,r;  

printf("请输入 p,q: ");    //输入两个素数q,p

scanf("%d%d",&p,&q);  

n=p*q;  

printf("n为%d\n",n);  

m=(p-1)*(q-1);

printf("m为%d\n",m);  

printf("请输入e: ");  

scanf("%d",&e);  

if(e<1||e>m)  

{  

  printf("e输入错误,请重新输入: ");  

  scanf("%d",&e);  

}  

d=1;  

while(((e*d)%m)!=1) d++;  

printf("计算出d为:%d\n",d);  

printf("加密请输入1,解密请输入2,输入其他退出\n");   

scanf("%d",&r);  

while(1)

{

 

  if(r==1)

  {

printf("请输入x: ");  //计算密文

scanf("%d",&x);  

y=candp(x,e,n);  

printf("密文为:%d\n",y);

  }

  else if(r==2)

 {

printf("请输入密文: ");  //计算明文

scanf("%d",&y);  

x=candp(y,d,n);  

printf("明文为%d\n",x);

  }

  else break;

printf("加密请输入1,解密请输入2,输入其他退出\n");   

scanf("%d",&r);

}

         return 0;

}


猜你喜欢

转载自blog.csdn.net/qq_40639185/article/details/80488806