[英]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.