RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2×e1)≡1(mod(p-1)×(q-1))。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A≡B^e2( mod n);B≡A^e1 (mod n);(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A≡B^e1 (mod n);B≡A^e2( mod n);
#include <stdio.h>
int main()
{
int a, m, n, a1, m1, n1, a2, m2, n2;
int i, j, cnt, quotient, tmp, s1 = 1, s2 = 1;
int mm[20];
printf("请输入数字(a, m, n):");
scanf("%d%d%d", &a, &m, &n);
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, a = %d\n", mm[i], s1, a1);
}
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;
printf("%d, ",s2);
if (mm[i] == 1)
{
s2 = (s2 * a) % n2;
}
printf("i = %d, b%d = %d, s = %d\n", cnt-1, cnt-1, mm[i], s2);
cnt--;
}
printf("最终结果为:s = %d\n", s2);
return 0;
}