2019蓝桥杯省赛(软件类A组) RSA

7 篇文章 0 订阅
4 篇文章 3 订阅

根据给的n可以通过sqrt(n)的时间复杂度求出q和p及

for(long long i=2;i*i<=n;i++)
if(n%i==0)
{
printf("%lld\n",i);
break;
}

p = 891234941 p=891234941 p=891234941
q = 1123984201 q=1123984201 q=1123984201
然后得到 p h i = ( p − 1 ) ∗ ( q − 1 ) phi=(p-1)*(q-1) phi=(p1)(q1)
又有 e d = 1 ( m o d   p h i ) ed=1(mod\ phi) ed=1(mod phi)
可以构造 d ⋅ x + p h i ⋅ y = 1 d\cdot x+phi \cdot y=1 dx+phiy=1
然后再利用扩展欧几里得算法可以求得d再模phi下的逆元 e e e,扩欧求得的逆元可能是负数所以用加一个模数再对用模数取余可以得到最小正整数解
有了e之后用一个快速幂就可以得到解密明文及 c e c^e ce,但是快速幂里面的模数n是long long 范围的所以为了防止乘法溢出用一个快速乘来解决乘法溢出问题

#include <bits/stdc++.h>
using namespace std;
long long n=1001733993063167141;
long long d=212353;
long long c=20190324;
long long p=891234941;
long long q=1123984201;
long long e=823816093931522017;
long long phi=(p-1)*(q-1);
void Ex_gcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return ;
    }
    long long x1,y1;
    Ex_gcd(b,a%b,x1,y1);
    x=y1;
    y=x1-(a/b)*y1;
}
long long quickmul(long long a,long long b)
{
    long long sum=0;
    while(b)
    {
        if(b%2==1)
            sum=(sum+a)%n;
        a=(a+a)%n;
        b=b/2;
    }
    return sum;
}
long long quickmod(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b%2==1)
            ans=quickmul(ans,a);
        a=quickmul(a,a);
        b=b/2;
    }
    return ans;
}
int main()
{
    long long x,y;
    Ex_gcd(d,(q-1)*(p-1),x,y);
    x=(x+phi)%phi;
    printf("e=%lld\n",x);
    printf("ans=%lld\n",quickmod(c,e));
    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值