1 条题解

  • 0
    @ 2025-4-6 21:41:16

    题目描述:

    描述一下题目中所给的RSA系统。首先找到两个大整数P,QN=PQ,P,Q,N=P*Q,然后令T=(P1)(Q1)T=(P-1)*(Q-1),令gcd(E,T)==1gcd(E,T)==1,再搞一个DD,令(ED)(E*D)%T=1,很明显这个DDEE%T的逆元。得到公匙E,N{E,N},私匙D,N{D,N},然后进行加密,C=MEC=M^E%N,M=C^D%N,现在题目给你CCE,N{E,N},需要你求MM

    分析: 思路还是比较明确的,通过NN找到P,QP,Q然后求出T,得到4E,再求,再求D最后就可以求出最后就可以求出M,后面的逆元和,后面的逆元和gcd都不是麻烦事,麻烦的在于找都不是麻烦事,麻烦的在于找P,Q,这题,这题N的数据太大,常规的质因子分解无法解决,这里要引入的数据太大,常规的质因子分解无法解决,这里要引入PollarRho$算法,这个算法的原理很复杂,可能但讲一篇博客都很难讲清楚,这里推荐另一位博主的博客:点击打开链接。

    #include<bits/stdc++.h>
    
    using namespace std;
    const int MOD=21252;
     
     
    long long multi_mod(long long x,long long y,long long c)
    {
        x = (x % c + c) % c;
        y = (y % c + c) % c;
     
        long long ans=0;
        while(y){
            if(y&1)ans=ans+x;
            if(ans>=c)ans-=c;
            x=x+x;
            if(x>=c)x-=c;
            y>>=1;
        }
        return ans;
    }
    long long gcd(long long x,long long y)
    {
        return y==0? x:gcd(y,x%y);
    }
    long long qpow(long long x,long long y,long long MOD)
    {
        long long res=1;
        while(y)
        {
            if (y&1) res=multi_mod(res,x,MOD);
            x=multi_mod(x,x,MOD);
            y=y>>1;
        }
        return res;
    }
    long long PollarRho(long long n,long long c)
    {
        srand(time(NULL));
        long long x=rand()%(n-1)+1;
        long long y=x;
        int i=1;
        int k=2;
        while(true)
        {
            i++;
            x=(qpow(x,2,n)+c)%n;
            long long d=gcd(n+y-x,n);
            if (1<d&&d<n) return d;
            if (y==x) return n;
            if (i==k)
            {
                y=x;
                k=k*2;
            }
        }
    }
    long long extgcd(long long a,long long b,long long &x,long long &y)//扩展欧几里德求逆元。
    {
        long long d=a;
        if (b!=0)
        {
            d=extgcd(b,a%b,y,x);
            y-=(a/b)*x;
        }
        else
        {
            x=1;
            y=0;
        }
        return d;
    }
     
    long long c,e,n;
     
    int main()
    {
        while(cin>>c>>e>>n)
        {
            long long p=PollarRho(n,10007);
           // cout<<p<<endl;
            long long q=n/p;
            long long t=(p-1)*(q-1);
            long long x0,y0;
            long long d=extgcd(e,t,x0,y0);
            x0=(x0%t+t)%t;
            cout<<qpow(c,x0,n)<<endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1449
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者