#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include<math.h>
char text[100];
int result[100];
int count = 0;
int getNi_52(int e, int n)//求逆
{
int d;
for (d = 0; d < n; d++)
{
if (e * d % n == 1)
return d;
}
}
int abc_52(int a,int m,int n)
{
int a1, m1, n1, a2, m2, n2;
int i, j, cnt, quotient, tmp, s1 = 1, s2 = 1;
int mm[20];
a1 = a2 = a;
m1 = m2 = m;
n1 = n2 = n;
quotient = m1;
for (i = 0; quotient != 0; i++)
{
mm[i] = quotient % 2;
quotient = quotient / 2;
}
j = i;
printf("模重复平方根算法:\n");
for (i = 0; i < j; i++)
{
if (mm[i] == 1)
{
s1 = (s1 * a1) % n1;
}
a1 = (a1 * a1) % n1;
printf("i = %d, s = %d\n", i, s1);
}
printf("最终结果为:s = %d\n\n\n", s1);
for (i = 0; i < j / 2 ; i++)
{
tmp = mm[i];
mm[i] = mm[j-i-1];
mm[j-i-1] = tmp;
}
cnt = j;
printf("平方乘算法:\n");
for (i = 0; i < j; i++)
{
s2 = (s2 * s2) % n2;
if (mm[i] == 1)
{
s2 = (s2 * a) % n2;
}
printf("i = %d, s = %d\n", cnt-1, s2);
cnt--;
}
printf("最终结果为:s = %d\n", s2);
return s2;
}
int main(){
int p,q,n,e,Q;
printf("请输入公钥,两个素数e,p,q:");
scanf("%d %d %d",&e,&p,&q);
n=p*q;
printf("输出模数n:%d\n",n);
int m = (p - 1) * (q - 1);
printf("输出模数n的欧拉数:%d",m);
int d;
d= getNi_52(e, m);
printf("\n输出模数私钥d=%d",d);
int c;
printf("\n请输入明文:");
scanf("%d",&c);
printf("RSA加密模幂运算底数 指数 模数 :%d %d %d\n",c,e,n);
printf("RS第0组 底数 指数 模数 :%d %d %d\n",c,e,n);
Q=abc_52(c,e,n);
printf("RSA解密模幂运算底数 指数 模数 :%d %d %d\n",Q,55,n);
abc_52(Q,55,n);
return 0;
}