C++ 编程:破解密码算法

近日来勒索病毒事件频繁发生,小 Y 对它的加密原理非常感兴趣,研究了一番相关知识之后,他就来给你看他的加密程序,并给你一段密文,和你炫耀说就算把程序给你看你也破解不出来。

你扫了一眼代码发现加密的公式为 b=ae%m,其中 e 是质数。

进一步分析发现 m=p*q,p 和 q 都为质数,p≠q,

作为一个计算机高手,你早就对加密算法烂熟于心,一眼就看出这个程序的算法和原理,找到了破解的方法,发现小 Y 疏忽在与给了你一个不够大的 m。

你知道解密的公式与加密对称,为 a=bd%m。

但是你仍然无法心算解出这个 d,因此你需要借助计算机来将密文破解。

输入

第一行有一个整数 T 表示数据组数。(T<=100)

接着有 T 组数据,每组数据两行。

第一行有四个数 e、p、q 和 n,其中 e、p、q 如题所描述,n 表示需要解密的数字序列长度。

第二行是需要解密的数字序列 a1..an。

1<p,q,e<=10^8,p、q、e 为质数且 p≠q 。

$0<=a_i 保证解密的结果即原数列的值小于 min(p,q) 并大于等于 0

1<=n<=100

保证 m 有且仅有两个不同的质因数 p 和 q,并且一定存在一个题中描述的参数 d 使得解密公式能够无损解密出所有 0~min(p,q)−1 范围之间的数字。

输出

对于每组数据输出一行,表示解密后的数字序列,数字之间以空格隔开。

样例输入 1

1 5 19 29 3 335 440 514

样例输出 1

65 67 77

提示

对于样例,存在 d=101 使得解密公式成立。

注意 m 和 ai 的大小可能超过 int 的范围

代码示例

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

long long mod_inverse(long long a, long long m) {
    long long m0 = m, t, q;
    long long x0 = 0, x1 = 1;

    if (m == 1)
        return 0;

    while (a > 1) {
        q = a / m;
        t = m;

        m = a % m;
        a = t;
        t = x0;

        x0 = x1 - q * x0;
        x1 = t;
    }

    if (x1 < 0)
        x1 += m0;

    return x1;
}

vector<long long> decrypt(int e, int p, int q, int n, vector<long long>& ciphertext) {
    long long m = p * q;
    long long phi = (p - 1) * (q - 1);
    long long d = mod_inverse(e, phi);
    vector<long long> plaintext(n);

    for (int i = 0; i < n; i++) {
        long long c = ciphertext[i];
        long long a = pow(c, d);
        plaintext[i] = a % m;
    }

    return plaintext;
}

int main() {
    int T;
    cin >> T;

    while (T--) {
        int e, p, q, n;
        cin >> e >> p >> q >> n;
        vector<long long> ciphertext(n);

        for (int i = 0; i < n; i++) {
            cin >> ciphertext[i];
        }

        vector<long long> plaintext = decrypt(e, p, q, n, ciphertext);

        for (int i = 0; i < n; i++) {
            cout << plaintext[i] << " ";
        }

        cout << endl;
    }

    return 0;
}

在以上代码中,我们首先定义了一个 mod_inverse 函数来计算模反元素 d。然后,我们定义了一个 decrypt 函数来进行解密操作。在函数中,我们首先计算 m 和 phi 的值,然后使用 mod_inverse 函数求解 d。接着,我们对每个密文进行解密,得到明文后返回结果。

在主程序中,我们首先读取输入的数据,然后调用 decrypt 函数进行解密,并将结果打印出来。

该代码使用了 long long 来处理可能超过 int 范围的情况,并使用了 pow 函数来计算幂次,需要包含头文件 <cmath>

希望这个代码示例对你有帮助!如果有任何问题,请随时提问。

C++ 编程:破解密码算法

原文地址: http://www.cveoy.top/t/topic/XW9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录