节点包“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”的解密问题的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs 使用node-rsa 加密数据

node-rsa模块加密遇到的一些坑

为啥我的 decipher.update 返回一个函数而不是解密的文本?节点JS

kubernetes:gpg 解密后,来自秘密 yaml 的值在节点 js 容器中被破坏

nodejs安装node-rsa遇到的问题及解决

RSA Java 加密和 Node.js 解密不起作用