【发布时间】:2019-09-28 13:39:34
【问题描述】:
在 RSA 非对称加密算法中,每个用户都有一个公钥 (n,e) 和一个私钥 (d) 来发送并接收来自其他用户的加密消息。
要加密消息,它会将字符更改为它们的 ascii 代码:
HELLO -> 72-69-76-76-79
要发送使用 RSA (c) 加密的消息,必须计算
c = m^e % n
使用公钥n和e为消息中的每个字符m。
要解密用户收到的消息,必须计算:
m = c^d % n (is the same to say m is congruent to c^d mod n)
对每个数字使用私钥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; }
如果使用大数字,我怎样才能得到结果?
我可以使用其他算法来找到答案吗?
有我可以使用的库吗?
【问题讨论】:
-
javascript 确实有一个
bigInt对象来处理大于 2^53-1 的数字。 -
@PeterN 我知道,这就是我提出问题的原因。
-
即使该函数工作它仍然无法工作(哈哈),我的意思是,你不能将求幂和模约简分开,中间结果会变得太大,至少对于合理的消息和密钥大小。
-
顺便说一下,加密单个 ASCII 字符是毫无用处的,这只会把它变成一个替换密码,你可以通过频率分析来破解它。
-
@harold 首先我是这么认为的,这就是我正在寻找另一种方法来获得它的原因,其次是放轻松,这只是教授算法的一个例子。
标签: javascript algorithm math bignum