实验名称:
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
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;
}