【发布时间】:2020-11-01 20:42:56
【问题描述】:
我尝试使用 RSA 加密和解密各种消息,虽然它在 d 为正数时完美运行,但当 d 为负数时它显然会中断,因为 d 应该是自然数。
我正在使用EXTENDED_EUCLID算法找到它,代码如下。
void EXTENDED_EUCLID(cpp_int a, cpp_int b, cpp_int&d, cpp_int&x, cpp_int&y) {
cpp_int n_d = d,
n_x = x,
n_y = y;
if(b == 0) {
d = a;
x = 1;
y = 0;
} else {
cpp_int n_a = a % b;
if (n_a < 0) n_a += b;
EXTENDED_EUCLID(b, n_a, n_d, n_x, n_y);
d = n_d;
x = n_y;
y = n_x - a / b * n_y;
}
}
递归调用EXTENDED_EUCLID(b, n_a, n_d, n_x, n_y); 之前的两行代码来自我在https://crypto.stackexchange.com/questions/10805/how-does-one-deal-with-a-negative-d-in-rsa 上找到的解决方案。显然我在这里做错了什么,也许他们需要定位在其他地方?
EXTENDED_EUCLID 的初始调用是使用来自名为 MODULAR_LINEAR_EQUATION_SOLVER 的函数的以下参数 EXTENDED_EUCLID(a, n, d, x, y); 进行的。 a 在这种情况下是 e(如果我没记错的话,是公钥)和 n 或 b 在这种情况下是 φ(n)。
感谢您为此付出时间,希望不是太愚蠢的问题。
【问题讨论】:
-
请提供minimal reproducible example,您的意见来自哪里?如果
d不应该是负数,你为什么要将它设置为负数进行测试? -
我没有用负数测试它,p、q 和 e 是伪随机数。 d 是否为负取决于机会。
-
所以 d 应该是无符号数而不是有符号数?
-
是的,它应该是一个无符号数,但这里并非总是如此。我在问题中包含的链接中描述了一种解决方案,但它对我不起作用。
-
扩展欧几里得算法用于计算逆,但它可能正确地产生负数。如果在计算逆 mod phi 时得到一个负数,那么只需将 phi 添加到它。