我正在尝试学习一些加密技术,所以我决定使用Node.js接受YouTube视频How the RSA algorithm works, including how to select d, e, n, p, q, and φ (phi)中提出的挑战。
因此面临挑战:
使用m^e mod n = c
加密密码,然后使用c^d mod n = m
对其进行解密,然后提供以下数据:
// Secret Message:
const m = 42;
// Prime Numbers:
const p = 61, q = 53;
// Other numbers:
const e = 17, n = 3233, d = 2753;
可悲的是,我很快发现Math.pow(c, d)
会产生Infinity
,所以我去了$ npm install big-number --save
而做了BigNumber(c).pow(d)
。这产生了一个实际数字,但模数运算后的最终结果仍然是错误的。当它应该是42时,我得到24号,我不能为我的生活理解为什么(虽然知道自己这可能是因为某些东西真的很愚蠢)。
以下是我为解决问题所做的相当天真的功能:
function encryptRSA(m, e, n) {
// return Math.pow(m, e) % n; // yields 1278 and not 2557
return BigNumber(m).pow(e).mod(n);
}
...和...
function decryptRSA(c, d, n) {
// return Math.pow(c, d) % n; // yileded 'Infinity' so dl'd BigNumber
return BigNumber(c).pow(d).mod(n);
}
问题是,为什么最后一个函数返回24而不是42?我该如何解决?
事实证明,解决方案真的像预期的那样愚蠢。该数字向后存储在对象BigNumber.number中。虽然以字符串形式打印时,但显示正确。我仍然不知道为什么会这样,所以对此的答案仍然会非常有趣。
我也非常感谢有关为什么常规模数运算得出错误答案的答案,特别是在第一个函数中,尽管我猜它与物理数量长度和内存限制有关...