繁体   English   中英

RSA解密C ++的私钥

[英]Private key for RSA decryption C++

我试图编写一个函数使用扩展的欧几里得算法为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 long long int 还要注意,当使用无符号值时, iter = -iter将无法按预期工作,因为它将下溢。 假设您的iter = 1那么-iter不会是-1 ,而是18446744073709551615 (= 2 ^ 18446744073709551615 )。 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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM