В алгоритме асимметричной криптографии RSA каждый пользователь имеет открытый ключ ( n , e ) и закрытый ключ ( d ) для отправки и получения в зашифрованном виде.сообщения от других пользователей.
Для шифрования сообщения он заменяет символы на их коды ascii:
HELLO -> 72-69-76-76-79
и отправляет сообщение в зашифрованном виде с помощью RSA ( c ), должен вычислять
c = m^e % n
для каждого символа m в сообщении с использованием открытых ключей n и e .
для расшифровки сообщения, которое получает пользователь, необходимо рассчитать:
m = c^d % n (is the same to say m is congruent to c^d mod n)
для каждого номера c присвоением секретного ключа d .
Немногопример:
пользователь Beto получил открытые ключи:
n = 64523
e = 127
и его закрытый ключ:
d = 15583
, если какой-либо пользователь хочет отправить сообщение в Beto:
ABAC -> 65-66-65-67
чтобы зашифровать сообщение, которое пользователь должен был вычислить
65^127 % 64523 = 27725
66^127 % 64523 = 6407
65^127 % 64523 = 27725
67^127 % 64523 = 2523
, а зашифрованный код был 27725-6407-27725-2523
Чтобы расшифровать сообщение пришлосьрассчитать:
27725^15583 % 64523 = 65
6407^15583 % 64523 = 66
27725^15583 % 64523 = 65
2523^15583 % 64523 = 67
и он получил расшифрованное сообщение 65-66-65-67
=> ABAC
.
Теперь вопрос:
У меня есть этот код длярешить последнюю часть, но я не могу использовать ее с большими числами (как в примере):
function getCongruence(c, d, n) {
return Math.pow(c,d) % n;
}
console.log(getCongruence(5,3,7)); // = 6 cuz 5^3=125 and 125 % 7 => 125 - 7*17 = 125 -119
console.log(getCongruence(19,11,17)); // = 8 cuz 19^11=116490258898219 % 17 = 8
console.log(getCongruence(27725,15583,64523)); // should be 65 but it shows NaN
.as-console-wrapper { max-height: 100% !important; top: 0; }
Как получить результат, если использовать большие числа?
Могу ли я использовать другой алгоритм, чтобы найти ответ?
есть библиотека, которую я могу использовать для этого?