节点包“node-rsa”的解密问题
Posted
技术标签:
【中文标题】节点包“node-rsa”的解密问题【英文标题】:Decryption Issue with Node Package "node-rsa" 【发布时间】:2019-07-13 17:58:09 【问题描述】:我正在尝试使用此库的 RSA 函数实现简单的公钥加密,但解密似乎被破坏了。
我有两个“用户”,Alice 和 Bob。 Alice 和 Bob(单独文件中的代码)都通过 const key = new nodeRSA()
创建了一个新的空密钥。然后,它们都通过函数key.generateKeyPair(2048)
生成一个 2048 位的公钥和私钥对。然后,他们通过使用key.exportKey('pkcs8-public-pem')
从密钥中导出它们并将它们存储到单独的文件中并使用 fs 读取它们来相互提供它们的公钥。然后 Alice 尝试通过将字符串消息和 bob 的公钥传递给下面的函数来向 bob 写入消息
module.exports.writeMessage = (message, key) =>
const k = new rsa(key, 'pkcs8-public-pem')
const cipherText = k.encrypt(message, 'hex');
console.log('Saving "$cipherText" to ctext.txt');
fs.writeFileSync('ctext.txt', cipherText);
;
然后,当 bob 去阅读消息时,他传入他的完整密钥并从 ctext.txt 中解码消息,如下面的函数所示
module.exports.readMessage = key =>
const encryptedMessage = fs.readFileSync('ctext.txt');
const message = key.decrypt(encryptedMessage, 'utf8');
return message;
;
加密工作正常,Alice 能够将密文发送到 ctext。当 bob 调用 readMessage 函数并尝试破译文本时,问题就出现了。 Alice 和 Bob 程序都被激活,并且它们的密钥在整个过程中保持不变。解密时出现以下错误:
Error: Error during decryption (probably incorrect key). Original error: Error: Incorrect data or key
at NodeRSA.module.exports.NodeRSA.$$decryptKey (/Users/jisacf1/College/SeniorYear/Spring2019/CompSec/HW3/node_modules/node-rsa/src/NodeRSA.js:301:19)
at NodeRSA.module.exports.NodeRSA.decrypt (/Users/jisacf1/College/SeniorYear/Spring2019/CompSec/HW3/node_modules/node-rsa/src/NodeRSA.js:249:21)
at Object.module.exports.readMessage.key [as readMessage] (/Users/jisacf1/College/SeniorYear/Spring2019/CompSec/HW3/Part2/rsaReadWrite.js:7:25)
at inquirer.prompt.then (/Users/jisacf1/College/SeniorYear/Spring2019/CompSec/HW3/Part2/bob.js:42:43)
at processTicksAndRejections (internal/process/next_tick.js:81:5)
我真的看不出系统如何认为它是不正确的密钥,因为 Alice 使用 Bob 的公钥加密了消息,而 Bob 正在使用私钥对消息进行解码。我也尝试过更改填充方案无济于事。任何帮助将不胜感激。供参考,图书馆的github在这里:https://github.com/rzcoder/node-rsa
【问题讨论】:
删除文件写入功能并执行上述内联过程后,我能够解码。那么在文件中写入和读取密文如何改变事情呢? 您可能有兴趣阅读this。似乎writeFileSync
默认为 UTF-8。老实说,忘记在函数名称中包含对写入文本而不是二进制的任何引用的 API 设计者应该会用线索棒得到很好的打击(在我看来,当我们用完线索棒时它涉及到 JS,但同样,这只是我的观点)。
请注意,RSA 加密仅对小消息有用。您可能想看看实现一个 hybrid cryptosystem,例如使用 AES-GCM 和随机密钥加密消息,然后使用 RSA-OAEP。
【参考方案1】:
正如 Maarten 所提到的,问题在于 writeFileSync
将我的密文编码为 utf8,而不是密文的格式。这导致读回的密文不正确,导致密钥或数据不匹配异常。将函数的默认编码更改为十六进制解决了这个问题。
【讨论】:
以上是关于节点包“node-rsa”的解密问题的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 decipher.update 返回一个函数而不是解密的文本?节点JS