应用密码学

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值