【发布时间】: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。
标签: javascript node.js cryptography