【问题标题】:How to deal with massive numbers in C如何处理C中的大量数字
【发布时间】:2015-10-23 21:13:57
【问题描述】:

我正在用 C 语言编写一个 RSA 加密算法。我不打算将它投入生产,主要是为了拓宽我对加密的理解。

如何处理 RSA 生成的大量数字?即使使用像 103 这样相对较小的私钥进行解密,我仍然有处理这样的事情的问题:

67^103 mod 143 = (1.21816096336830017301951805581 x 10^188) mod 143

存储这种大小的数字的最佳方法是什么?有没有办法使用标准库来做到这一点? .

【问题讨论】:

  • 您可以自己实现所有大数运算,但使用现有的多精度库(如 GMP)会更容易。
  • @ArtjomB。我在想我可以实现一个使用数组来存储以 2^64 为底的数字。我不知道这是否实用。
  • 那行得通。不过要小心溢出。你必须实现乘法,然后是除法(对于模)。但说真的,只需使用 GMP。
  • @mstagg RSA 涉及大整数,在您的示例中,您显示了一个实数。这是一个大型 int 库的案例,或者编写一个有教育意义但不会太费力的案例。
  • @Weather Vane 不同意这里67^103 mod 143 是一个大型int 图书馆的案例。输入都是 solvable,带有快速简单的整数数学。

标签: c algorithm encryption


【解决方案1】:

错误的方法。 67^103 mod 143 不需要先计算67^103

循环计算modulo,一次计算1位指数。

uint32_t powmod(uint32_t base, uint32_t expo, uint32_t mod) {

  // % mod need only for the cases expo==0, mod<=1
  uint32_t y = 1u % mod;

  while (expo) {
    if (expo & 1u) {
      y = ((uint64_t) base * y) % mod;
    }
    expo >>= 1u;
    base = ((uint64_t) base * base) % mod;
  }

  return y;
}

int main(void) {
  printf("%lu",(unsigned long)  powmod(67, 103, 143));
}

输出

89

【讨论】:

  • “处理 RSA 生成的海量数字”的 技巧 是不要以通常的方式进行数学运算 - 使用上述的捷径。
  • 哦哦,是的,甚至之前做过这个力量练习,通过对待每一位力量:没有仔细阅读Q,+1。
  • @Weather Vane 是的 - RSA 的全部意义在于使用计算技巧,如果有钥匙的话,可以解决数学黑盒问题,否则用蛮力计算是不可行的。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2021-08-06
  • 2016-12-14
相关资源
最近更新 更多