【问题标题】:RSA exponent d is negativeRSA 指数 d 为负
【发布时间】: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(如果我没记错的话,是公钥)和 nb 在这种情况下是 φ(n)

感谢您为此付出时间,希望不是太愚蠢的问题。

【问题讨论】:

  • 请提供minimal reproducible example,您的意见来自哪里?如果d 不应该是负数,你为什么要将它设置为负数进行测试?
  • 我没有用负数测试它,p、q 和 e 是伪随机数。 d 是否为负取决于机会。
  • 所以 d 应该是无符号数而不是有符号数?
  • 是的,它应该是一个无符号数,但这里并非总是如此。我在问题中包含的链接中描述了一种解决方案,但它对我不起作用。
  • 扩展欧几里得算法用于计算逆,但它可能正确地产生负数。如果在计算逆 mod phi 时得到一个负数,那么只需将 phi 添加到它。

标签: c++ boost rsa


【解决方案1】:

解决方案是将EXTENDED_EUCLID(b, n_a, n_d, n_x, n_y); 递归调用上方的两行代码移至函数MODULAR_LINEAR_EQUATION_SOLVER 的初始EXTENDED_EUCLID 调用下方。非常感谢 James K. Polk 总统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多