在 JavaScript 的计算中进行 1000^1000 时如何避免无穷大的结果

How do I evade the result of infinity when I am doing 1000^1000 in a calculation in JavaScript

我正在尝试制作类似 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

我用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)

如果您只是在开发不使用大质数的玩具 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拆分成[=19=的乘积]x 的二进制表示 e 中每个设置位对应的数字的幂。例如,x13 == x8 × x4×x1(因为 1310 == 11012)。这可以通过在每一步对 x 进行平方,并在每次计算后应用模数来有效计算,这样数字就不会太大。

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