RSA

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 

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;
}




你可能感兴趣的:(密码学)