Шифрование RSA в JavaScript

При шифровании RSA приходится выполнять такую операцию (x^e) mod N. Числа x,e,N могут быть 300 - значными и даже больше. Внимание вопрос. Как в JS реализовать вот это самое (x^e) mod N ? Желательно готовый пример кода, а не ссылка :-)


Ответы (2 шт):

Автор решения: Павел Ериков

Через онлайн редактор код ниже у меня работает за считанные секунды: Используется библиотека длинных чисел

let x = bigInt("136546546465465465465465449849846546516557498794654654798449464165749864");

let N = bigInt("14645654654654654654654654165465765461697941657496641");

let e = bigInt("9999999");

console.log(x.modPow(e, N).toString());
<script src="https://peterolson.github.io/BigInteger.js/BigInteger.min.js"></script>

→ Ссылка
Автор решения: AlexShag

Благодаря Павел Ериков я порылся в исходниках https://peterolson.github.io/BigInteger.js/BigInteger.min.js
И вот что получилось.

function PowMod(x, e, N) {
    var r = 1n, base = x % N;
    while (e > 0) {
        if (base == 0n) return 0n;
        if ((e & 1n) === 1n) r = (r * base) % N;  // Если не чётное
        e = e >> 1n;
        base = (base * base) % N;
    }
    return r;
}

Работает ещё быстрее чем в оригинале. Так что всем кому нужно пользуйтесь на здоровье :-)

→ Ссылка