hdu 1211 RSA算法

題意:給出密文,根據祕鑰求解明文


RSA算法流程

(1)用戶祕密選擇兩個大素數p, q,然後計算出N = pq;

(2)用戶計算出F_N = (p-1)(q-1),然後隨機選擇一個整數e,滿足1 < e < F_N,且gcd(e, F_N) == 1.e爲加密祕鑰

(3)然後用e和F_N算出脫密祕鑰d,ed%F_N==1,d是e mod F_N 的逆元,d是脫密祕鑰

(4)e, N是公開參數,即公鑰,p, q,d嚴格保密

加密:c = E(m) = m ^e(modN)

解密:m = D(c) = c ^ d(modN)


題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1211


#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

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

ll inv(ll a, ll n)
{
    ll d, x, y;
    d = ect_gcd(a, n, x, y);
    return d == 1 ? (x + n) % n : -1;
}

ll pow_mod(ll x, ll n, ll mod)
{
    ll res = 1;
    while(n)
    {
        if(n & 1) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}

ll solve(ll c, ll d, ll N)
{
    return pow_mod(c, d, N);
}

int main()
{
    int l;
    ll N, F_N;
    ll p, q, e, d;
    while(~scanf("%I64d%I64d%I64d%d", &p, &q, &e, &l))
    {
        N = p * q, F_N = (p - 1) * (q - 1);
        d = inv(e, F_N);
        for(int i = 0; i < l; i++)
        {
            ll val;
            scanf("%I64d", &val);
            printf("%c", solve(val, d, N) % 128);
        }
        printf("\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章