开发者社区 问答 正文

RSA算法中 r 无法满足e*r%t ==1的问题

p=47;q=59;t=(p-1)×(q-1)=2668;r是与t互质的数,并满足r

展开
收起
知与谁同 2018-07-19 13:23:41 1845 分享 版权
1 条回答
写回答
取消 提交回答
  • #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    unsigned __int64 GCD(unsigned __int64 a,unsigned __int64 b)
    {
    if(b==0)
    return a;
    return GCD(b,a%b);
    }

    /*
    已知a、b,求x,满足a*x =1 (mod b)
    相当于求解a*x-b*y=1的最小整数解
    */
    unsigned __int64 Euclid(unsigned __int64 a, unsigned __int64 b)
    {
    unsigned __int64 m, e, i, j, x, y;
    long xx, yy;
    m=b;
    e=a;
    x=0;
    y=1;
    xx=1;
    yy=1;
    while(e)
    {
    i=m / e;
    j=m % e;
    m=e;
    e=j;
    j=y;
    y*=i;
    if(xx == yy)
    {
    if(x > y)
    {
    y=x - y;
    }
    else
    {
    y-=x;
    yy=0;
    }
    }
    else
    {
    y+=x;
    xx=1 - xx;
    yy=1 - yy;
    }
    x=j;
    }
    if(xx == 0)
    {
    x=b - x;
    }
    return x;
    }

    unsigned __int64 RandomRelativelyPrime(unsigned __int64 n)
    {
    unsigned __int64 r;
    srand(time(NULL));
    do
    {
    r=rand()%n;
    }while(GCD(r,n)!=1);
    return r;
    }

    int main(int argc, char *argv[])
    {
    unsigned __int64 p=47;
    unsigned __int64 q=59;
    unsigned __int64 n=p*q;
    unsigned __int64 t=(p-1)*(q-1);
    unsigned __int64 e1=889/*RandomRelativelyPrime(t)*/;
    unsigned __int64 e2=Euclid(e1,t);
    printf("p=%I64d q=%I64d p*q=%I64d t=%I64d e1=%I64d e2=%I64d\n",p,q,n,t,e1,e2);
    return 0;
    }
    2019-07-17 22:56:40
    赞同 展开评论
问答分类:
问答标签:
问答地址: