蓝桥杯rsa解密

1|0需要知识点

快速乘、快速加、扩展欧几里得原理

2|0模板

快速乘

ll qkc(ll a,ll b){ ll ans = 0; while(b) { if(b&1) ans = (ans+a)%n; a=(a+a)%n; b /=2; } return ans; }

快速幂

ll qkm(ll a,ll b){ ll ans = 1; while(b) { if(b&1) ans =qkc(ans,a); a = qkc(a,a); b/=2; } return ans; }

扩展欧几里德

ll exgcd(ll a,ll b,ll &x,ll &y) { if(!b) { x=1,y=0; return a; } ll d = exgcd(b,a%b,y,x); y -= a/b*x; return d; }

3|0解题

题目
题目没有限制是那两个素数,所以硬筛两个p,q即可,令b = (q-1)*(p-1)
已知b,a(即d) 可得方程 de mod b = 1 => de -k*b = 1;
用扩展欧几里得可求二元一次方程的可行解,可求得e = x,k = y
x可能小于0,用b余一下e = (x+b)%b,这样才能用于指数
结果即是c的e次方余n
题解代码

//by InsiApple #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; #define fi first #define se second #define mp make_pair #define pb push_back #define rep(i,n,m) for(int i=(n);i<=(m);i++) #define per(i,n,m) for(int i=(m);i>=(n);i--) #define all(a) a.begin(), a.end() #define pw(x) (1ll<<(x)) #define endl "\n" #define Mod 100000000 const int N = 1e6+10; ll n=1001733993063167141; ll d=212353; ll C=20190324; ll p,q,e; ll qkc(ll a,ll b){ ll ans = 0; while(b) { if(b&1) ans = (ans+a)%n; a=(a+a)%n; b /=2; } return ans; } ll qkm(ll a,ll b){ ll ans = 1; while(b) { if(b&1) ans =qkc(ans,a); a = qkc(a,a); b/=2; } return ans; } ll exgcd(ll a,ll b,ll &x,ll &y) { if(!b) { x=1,y=0; return a; } ll d = exgcd(b,a%b,y,x); y -= a/b*x; return d; } int main(){ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); for(q = 2;q<n;q++) if(n%q==0){ p = n/q; break; } ll k = (p-1)*(q-1); ll x,y; exgcd(d,(p-1)*(q-1),x,y); q = (p-1)*(q-1); x = (x+q)%q; //cout<<x<<endl; cout<<qkm(C,x); return 0; }

__EOF__

本文作者InsiApple
本文链接https://www.cnblogs.com/InsiApple/p/16001731.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   InsiApple  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示