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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值