用于 RSA 解密C++的私钥

Private key for RSA decryption C++

本文关键字:私钥 C++ 解密 RSA 用于      更新时间:2023-10-16

我尝试编写一个函数来使用扩展欧几里得算法查找 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;
}

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

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

所以基本上,如果你有你的密文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)
}