我尝试使用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;
}
答案 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)
}