Javascript(NodeJS)中的自定义RSA实现

时间:2018-05-18 09:52:31

标签: javascript node.js encryption rsa

我尝试将RSA的基础知识实现为一个简单的NodeJS / javascript文件。

对于加密,我使用了c = m^e % n 对于解密,我使用了m = c^d % n

const p = 7; // choice prime
const q = 13; // choice prime
const n = p * q;
const e = 5; // choice
const Ke = [e, n]; // the private key
const d = 29; // choice
const Kd = [d, n]; // the public key

let message = 'hello'
let encrypted = []

message = message.toUpperCase()

for (let i = 0; i < message.length; i++) {
  const char = message.charCodeAt(i) - 64 // m
  const pow = Math.pow(char, e) // m^e
  const mod = pow % n // mod n
  encrypted[i] = mod
}

encrypted.forEach(char => {
  const pow = Math.pow(char, d) // c^d
  const mod = pow % n // mod n
  console.log(String.fromCharCode(mod + 64))
})

加密进展顺利。但是,解密有一些问题。它会显示我在let message = 'hello'部分

中添加的其他字符

我在解密时做错了什么?

1 个答案:

答案 0 :(得分:1)

encrypted.forEach(char => {
  const pow = Math.pow(char, d) // c^d
  const mod = pow % n // mod n
  console.log(String.fromCharCode(mod + 64))
})

在上述功能中,功率太大,精度损失。 例如,在&#39; L&#39;:

的情况下
{ char: 38, d: 29, pow: 6.512148596632774e+45, mod: 81 }

使用一种技术来计算pow的mod而不会丢失精度,它可以正确解码。

encrypted.forEach(char => {
  let mod = 1
  for (let i = 0; i < d; i++) {
    mod = (mod * char) % n
  }
  console.log(String.fromCharCode(mod + 64))
})

输出:

H
E
L
L
O