【问题标题】:Private key for RSA decryption C++用于 RSA 解密 C++ 的私钥
【发布时间】:2014-03-01 16:30:06
【问题描述】:

我尝试编写一个函数来使用扩展欧几里得算法查找 RSA 的私钥,但我找不到错误,但我真的不想从头开始!对于某些值,它是正确的,但对于其他值,它不是正确的,我不知道为什么,我真的很感激帮助,如果这个问题太含糊,我很抱歉(我知道这往往会惹恼这里的人)。任何人都可以找到错误吗?提前非常感谢您:

unsigned long long int  modinv(unsigned long long int  u, unsigned long long int  v)
{
    unsigned long long int  inv, u1, u3, v1, v3, t1, t3, q;
    unsigned long long int  iter;

    u1 = 1;
    u3 = u;
    v1 = 0;
    v3 = v;

    iter = 1;

    while (v3 != 0)
    {

        q = u3 / v3;
        t3 = u3 % v3;
        t1 = u1 + q * v1;

        u1 = v1; v1 = t1; u3 = v3; v3 = t3;
        iter = -iter;
    }

    if (u3 != 1)
        return 0;
    if (iter < 0)
        inv = v - u1;
    else
        inv = u1;
    return inv;
}

【问题讨论】:

    标签: c++ encryption rsa private-key


    【解决方案1】:

    此处不要使用无符号值,因为它会使算法无效。因此,您可以使用long long int 而不是unsigned long long int。另请注意,iter = -iter 在使用无符号值时将无法按预期工作,因为它会下溢。假设您有iter = 1,那么-iter 将不是-1,而是18446744073709551615 (=2^64 - 1)。 iter &lt; 0 的检查也总是错误的。

    对于任何现实生活中的应用程序,您需要的数字要比 64 位类型的数字大得多。有很多方法可以做到这一点,但GMP(GNU 多精度库)有mpz_powm(r, base, exp, mod),您可以在解密阶段使用它。更多信息here.

    因此,基本上,如果您将密文 c 和私钥定义为 n (=p*q) 和 d,那么您可以将 c 解密为明文 m,如下所示:

    #include <gmp.h> // requires GMP lib to be installed.
    void rsaDecrypt(const mpz_t c, const mpz_t n, const mpz_t d, mpz_t m) {
      mpz_init(m);
      mpz_powm(m, c, d, n); // m = c^d (mod n)
    }
    

    【讨论】:

    • 非常感谢,我猜密文输入c是数字?
    • 哦,您需要安装 GMP 才能使用它。我只是给你一些想法。但首先尝试使用long long int 作为数据类型,这样它就不是无符号的。然后再次尝试使用您的测试数据。
    • 是的,这行得通,太棒了,谢谢!我会自己做而不是使用GMP 我认为(或至少尝试)。
    • 欢迎您并感谢您的积分。自己实现东西来学习是一件非常好的事情。
    最近更新 更多