zoukankan      html  css  js  c++  java
  • 2018 CCPC-Final K

    (cequiv FLAG^{2^{30}+3} ~~ (mod~~n))
    给定(c)(n)(n)为两接近的素数乘积,求(FLAG)


    (RSA)

    • 寻找两个质数(p)(q),令(n=p*q)
    • 计算欧拉函数(varphi(n)=(p-1)*(q-1))
    • 寻找公钥(e),满足(1< e < varphi(n))(e)(n)互质
    • 计算私钥(d)(e*dequiv 1 ~~ (mod ~~ varphi(n)))

    (c)为密文,(m)为明文
    加密:(c=m^e ~ mod ~ n)
    解密:(m=c^d ~ mod ~ n)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll mul(ll u, ll v, ll p) {
        return (u * v - ll((long double)u * v / p) * p + p) % p;
    }
    ll qpow(ll x, ll y, ll mod) {
        ll ans = 1;
        for (; y; y >>= 1, x = mul(x, x, mod))
            if (y & 1) ans = mul(ans, x, mod);
        return ans;
    }
    ll extend_gcd(ll a, ll b, ll &x, ll &y) {
        if (a == 0 && b == 0) return -1;
        if (!b) {
            x = 1, y = 0;
            return a;
        }
        ll d = extend_gcd(b, a % b, y, x);
        y -= a / b * x;
        return d;
    }
    ll inv(ll a, ll n) {
        ll x, y;
        ll d = extend_gcd(a, n, x, y);
        if (d == 1) return (x % n + n) % n;
        return -1;
    }
    int main() {
        int t;
        ll n, c;
        scanf("%d", &t);
        for (int _ = 1; _ <= t; _++) {
            scanf("%lld%lld", &n, &c);
            ll qn = sqrt(n), q, p;
            while (1) {
                if (n % qn == 0) {
                    q = qn;
                    p = n / q;
                    break;
                }
                qn--;
            }
            ll phi = (q - 1) * (p - 1);
            ll d = inv(1073741827ll, phi);
            printf("Case %d: %lld
    ", _, qpow(c, d, n));
        }
        return 0;
    }
    
  • 相关阅读:
    如何让自己的app尽量不被系统杀死
    linux常用命令-权限管理命令
    linux常用命令-用户管理命令
    linux常用命令-文件处理命令
    npm命令
    新技术新框架新工具选型原则
    tomcat启动命令行中文乱码
    docker命令
    tinkpad e450c 进入 BIOS
    基于Java服务的前后端分离解决跨域问题
  • 原文地址:https://www.cnblogs.com/Zeronera/p/13904051.html
Copyright © 2011-2022 走看看