RSA解密C ++的私钥

时间:2014-03-01 16:30:06

标签: c++ encryption rsa private-key

我尝试使用Extended Euclidean算法编写一个函数来查找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;
}

1 个答案:

答案 0 :(得分:1)

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

对于任何现实生活中的应用程序,您需要的数字远远超过64位类型。有很多方法可以做到这一点,但GMP(GNU Multiple Precision lib)有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)
}