📄 rsa.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "conio.h"
#include "math.h"
#include "iostream.h"
int Getzhishu(int a)
{
int b,i,c,t;
int f=1;
do{
srand(time(NULL));
i=rand()%100;
b=i;
c=a;
//辗转相除法
while(t=c%b)
{
c=b;b=t;
}
if(b==1) f=0;
}while(f!=0);
return i;
}
int Getd(int a,int b)
{
int t=b,i;
t=t+1;
i=t%a;
while(i)
{
t=t+b;
i=t%a;
}
return(t/a);
}
long int Getvalues(long int i,long int k,int n)
{
long int results=1;
//底数
long int im=i;
//指数
long int ik=k;
//把k以2进制的形式进行移位相乘做迭代
while(ik)
{
//当前的最低位是否为1(就是判断是否是奇数),是将计算一次乘积
if(ik&1) results=(results*im)%n;
//高位右移,即指数除以了2
ik>>=1;
//做一次二次方,一直到指数最高位为0为止
im=(im*im)%n;
}
return results;
}
void main()
{
//p,q为两个大素数
int p=73;
int q=79;
//得到公钥n
int n=p*q;
int r=(p-1)*(q-1);
int e,d;
//得到公钥e
e=Getzhishu(r);
printf("公钥为e=%d,n=%d\n",e,n);
//得到秘钥d
d=Getd(e,r);
printf("秘钥为d=%d\n",d);
printf("请输入明文:\n");
int c,i;
int a[100];
i=0;
while ((c=getchar())!='\n')
{
a[i]=c;
i=i+1;
}
//加密
printf("\n");
printf("加密后为\n");
long int b[100];
for(int j=0;j<i;j++)
{b[j]=Getvalues(a[j],e,n);
printf("%c",b[j]);
}
//解密
printf("\n");
printf("解密后为\n");
long int s[100];
printf("\n");
for(int k=0;k<i;k++)
{s[k]=Getvalues(b[k],d,n);
printf("%c",s[k]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -