开发者社区> 问答> 正文

求一段优质的C语言写的RSA算法

求一段优质的C语言写的RSA算法

展开
收起
知与谁同 2018-07-18 17:02:39 1653 0
1 条回答
写回答
取消 提交回答
  • #include <stdio.h>
    int candp(int a,int b,int c) //数据处理函数,实现幂的取余运算

    {
    int r=1;
    b=b+1;
    while(b!=1)
    {
    r=r*a;
    r=r%c;
    b--;
    }
    printf("%d\n",r);
    return r;
    }
    int fun(int x,int y) //公钥e与t的互素判断
    {
    int=t;
    while(y)
    {
    t=x;
    x=y;
    y=t%y;
    }
    if(x==1)
    return 0; //x与y互素时返回0
    else
    return 1; //x与y不互素时返回1
    }

    void main()

    {
    int p,q,e,d,m,n,t,c,r;
    printf("请输入两个素数:p,q:");
    scanf("%d%d",&p,&q);
    n=p*q;
    printf("计算得n为%3d\n",n);
    t=(p-1)*(q-1); //求n的欧拉数
    printf("计算得t为%3d\n",t);
    printf("请输入公钥e:");
    scanf("%d",&e);
    if(e<1||e>t||fun(e,t))
    {
    printf("e不合要求,请重新输入:") //e<1或e>t或e与t不互素时,重新输入
    scanf("%d",&e);
    }
    d=1;
    while(((e*d)%t)!=1)d++; //由公钥e求出私钥d
    printf("经计算d为%d\n",d);
    printf("加密请输入1\n"); //加密or解密选择
    printf("解密请输入2\n");
    scanf("%d",&r);
    switch(r)
    {

    case1:printf("请输入明文m:"); //输入要加密的明文数字
    scanf("%d",&m);
    c=candp(m,e,n);
    printf("密文为%d\n",c);break;
    case2:printf("请输入密文c:"); //输入要解密的密文数字
    scanf("%d",&c);
    m=candp(c,d,n);
    printf("明文为%d\n",m);break;
    }

    }

    RSA算法描述
    1、选取长度相等的两个大素数p和q,计算其乘积:

    n=pq

    然后随机选取加密密钥e,使e和(p-1)(q-1)互素。

    最后用欧几里得拓展算法计算解密密钥d,以满足

    ed=1(mod(p-1)(q-1))



    d=e-1mod((p-1)(q-1))

    e和n是公钥,d是私钥

    2、机密公式如下:
    ci=mi^e(modn)
    3、解密时,取每一密文分组ci并计算:
    mi=ci^d(modn)
    Ci^d=(mi^e)^d=mi^(ed)=mi^[k(p–1)(q–1)+1]=mimi^[k(p–1)(q–1)]=mi*1=mi
    4、消息也可以用d加密e解密

    注意:此程序只是针对RSA算法的入门,无法达到安全要求的位数,谨慎使用。
    2019-07-17 22:56:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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