开发者社区> 问答> 正文

如何用C语言实现RSA算法?

如何用C语言实现RSA算法?

展开
收起
知与谁同 2018-07-20 17:25:59 3196 0
1 条回答
写回答
取消 提交回答
  • 上学期交的作业,已通过老师在运行时间上的测试
    #include <stdio.h>
    #include <stdlib.h>

    unsigned long prime1,prime2,ee;

    unsigned long *kzojld(unsigned long p,unsigned long q) //扩展欧几里得算法求模逆
    {
    unsigned long i=0,a=1,b=0,c=0,d=1,temp,mid,ni[2];
    mid=p;
    while(mid!=1)
    {
    while(p>q)
    {p=p-q; mid=p;i++;}
    a=c*(-1)*i+a;b=d*(-1)*i+b;
    temp=a;a=c;c=temp;
    temp=b;b=d;d=temp;
    temp=p;p=q;q=temp;
    i=0;
    }
    ni[0]=c;ni[1]=d;
    return(ni);
    }

    unsigned long momi(unsigned long a,unsigned long b,unsigned long p) //模幂算法
    {
    unsigned long c;
    c=1;
    if(a>p) a=a%p;
    if(b>p) b=b%(p-1);
    while(b!=0)
    {
    while(b%2==0)
    {
    b=b/2;
    a=(a*a)%p;
    }
    b=b-1;
    c=(a*c)%p;
    }
    return(c);
    }

    void RSAjiami() //RSA加密函数
    {
    unsigned long c1,c2;
    unsigned long m,n,c;
    n=prime1*prime2;
    system("cls");
    printf("Please input the message:\n");
    scanf("%lu",&m);getchar();
    c=momi(m,ee,n);
    printf("The cipher is:%lu",c);
    return;
    }

    void RSAjiemi() //RSA解密函数
    {
    unsigned long m1,m2,e,d,*ni;
    unsigned long c,n,m,o;
    o=(prime1-1)*(prime2-1);
    n=prime1*prime2;
    system("cls");
    printf("Please input the cipher:\n");
    scanf("%lu",&c);getchar();
    ni=kzojld(ee,o);
    d=ni[0];
    m=momi(c,d,n);
    printf("The original message is:%lu",m);
    return;
    }

    void main()
    { unsigned long m;
    char cho;
    printf("Please input the two prime you want to use:\n");
    printf("P=");scanf("%lu",&prime1);getchar();
    printf("Q=");scanf("%lu",&prime2);getchar();
    printf("E=");scanf("%lu",&ee);getchar();
    if(prime1<prime2)
    {m=prime1;prime1=prime2;prime2=m;}
    while(1)
    {
    system("cls");
    printf("\t*******RSA密码系统*******\n");
    printf("Please select what do you want to do:\n");
    printf("1.Encrpt.\n");
    printf("2.Decrpt.\n");
    printf("3.Exit.\n");
    printf("Your choice:");
    scanf("%c",&cho);getchar();
    switch(cho)
    { case '1':RSAjiami();break;
    case '2':RSAjiemi();break;
    case '3':exit(0);
    default:printf("Error input.\n");break;
    }
    getchar();
    }
    }
    2019-07-17 22:56:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载