HDOJ-1211-RSA 解题报告

本文介绍了HDOJ-1211题目的解题思路,该题目涉及RSA加密算法。解题方法包括通过加密方式求解明文,利用快速幂运算解决同余方程。在了解了p、q、e等参数后,通过枚举ASCII值找到满足条件的明文m,并输出对应字符。
摘要由CSDN通过智能技术生成

       同余方程或快速幂水题。题意: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是密文,求输出明文。


       解题思路:可以通过加密方法求明文也可以通过解密方法求明文,通过加密方法求明文的话就是找一个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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值