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;

}

 

  • 21
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值