【问题标题】:How do I evade the result of infinity when I am doing 1000^1000 in a calculation in JavaScript当我在 JavaScript 中进行 1000^1000 的计算时,如何避免无穷大的结果
【发布时间】:2018-06-01 01:52:53
【问题描述】:

我正在尝试制作类似 RSA 的加密程序。因此我需要计算 1069^1099。问题在于,根据 Javascript,该计算的结果是无穷大的。有没有办法解决这个问题?

var n = 23 * 83;
var e = 87;
var d = 1099;
var m = 1069;
var m = m**d % n; //Result NaN because m**d = infinity

【问题讨论】:

标签: javascript encryption output rsa infinity


【解决方案1】:

如果您只是在开发一个不使用大素数的玩具 RSA 密码,那么您可以实现 modular exponentation,如下所示:

function modexp(base, exponent, modulus) {
    var result = 1;
    while (exponent) {
        if (exponent & 1) {
            result = (result * base) % modulus;
        }
        base = (base * base) % modulus;
        exponent >>= 1;
    }
    return result;
}

维基百科的文章有详细的描述,但它基本上所做的是将xe分解成x的乘积e 的二进制表示中的每个设置位对应的数字。例如,x13 == x8 × x4 × x1(因为 1310 == 11012)。这可以通过在每个步骤中对 x 进行平方来有效地计算,并在每次计算后应用模数,这样数字就不会变得太大。

正如其他人所说,您需要big number library 来处理真实世界的 RSA 密钥。

【讨论】:

  • 谢谢,我自己也做了类似的东西:)
【解决方案2】:

我使用bignum来规避js中大数的限制。

https://www.npmjs.com/package/bignum

您的代码将如下所示:

var result = bignum(m).pow(d).mod(n)
// or more consicely
var result = bignum(m).powm(d, n)

【讨论】:

  • 你不需要 bignum 来计算 1000 到 1000 mod 1069。
  • 需要详细说明吗?
  • javascript 数字类型是IEEE 754 binary64。它具有 53 位精度。 n=1069 使用 11 位(实际上是 10.06 位)。使用binary modular exponentiation algorithm,任何中间产品都不需要大于 n*n,一个 21 位的数字。因此,中间结果和最终答案很容易放入 javascript 数字中。或者,看看其他答案。
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多