HDOJ-1211-RSA 解题报告

       同余方程或快速幂水题。题意:RSA加密算法是这样的,

1.选择两个大素数p和q

2.计算n = p × q,F(n) = (p - 1) × (q - 1)

3.选择一个整数e(1 < e < F(n)),令gcd(e, F(n)) = 1,e 就是公钥

4.计算一个整数d,使得d × e = 1 (mod F(n)),d 就是密钥

加密用这个方法

C = E(m) = m^e mod n

解密用这个方法

M = D(c) = c^d mod n

现在给你p,q,e,l以及接下来l个c,c是密文,求输出明文。


扫描二维码关注公众号,回复: 3877960 查看本文章

       解题思路:可以通过加密方法求明文也可以通过解密方法求明文,通过加密方法求明文的话就是找一个ASCII值m使得m^e mod n = c就行了,使用快速幂,解密方法的话就是要找到一个d使得c^d mod n的结果是在ASCII值范围内,要用同余方程。这里用的是加密方法求明文。

算出n后直接枚举ASCII值使得m^e mod n = c然后输出m代表的字符就行了。


       解题代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <limits.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

typedef long long LL;

LL p, q, n, e, l, c;

LL FastPow(LL base, LL n, LL mod);

int main()
{
    while (~scanf("%lld %lld %lld %lld", &p, &q, &e, &l))
    {
        n = p * q;
        for (LL i=0; i<l; ++i)
        {
            scanf("%lld", &c);
            for (LL i=0; i<256; ++i)
            {
                if (FastPow(i, e, n) == c)
                {
                    printf("%c", (int)i);
                    break;
                }
            }
        }
        puts("");
    }
    return 0;
}

LL FastPow(LL base, LL n, LL mod)
{
    LL res = 1;
    base %= mod;
    while (n)
    {
        if (n & 1)
        {
            res *= base;
            res %= mod;
        }
        base *= base;
        base %= mod;
        n >>= 1;
    }
    return res;
}


猜你喜欢

转载自blog.csdn.net/JZQT_T/article/details/44959887