javascript - RSA私钥无法解密数据

标签 javascript node.js encryption rsa

我正在使用 JavaScript 和 Node.js 开发一种消息传递项目。创建用户时,服务器使用 Node.js crypto 库生成 RSA key 对。私钥使用用户密码加密。在 webapp 上,当用户 A 向用户 B 发送消息时,数据使用用户 B 的公钥加密。当用户 B 收到消息时,使用他们的私钥和密码对其进行解密。

我的问题是,虽然该应用似乎加密了数据,但我无法解密数据。抛出的错误消息实际上是“无法解密数据”,这没有帮助。

用于生成 key 对的服务器端代码:

// Generate public/private keypairs
exports.generateKeyPair = (password) => {
    return new Promise((resolve, reject) => {
        crypto.generateKeyPair('rsa', {
            modulusLength: 4096,
            publicKeyEncoding: {
                type: 'spki',
                format: 'pem'
            },
            privateKeyEncoding: {
                type: 'pkcs8',
                format: 'pem',
                cipher: 'aes-256-cbc',
                passphrase: password
            }
        }, (err, publicKey, privateKey) => {
                if (err) reject(err);
                else resolve([publicKey, privateKey]);
        });
    })
}

用于解密和加密的客户端代码(使用 Browserify 将 Node 加密库发送到客户端):

var crypto = require('crypto');

window.encrypt = function (data, publicKey) {
    let buffer = Buffer.from(data);
    let encrypted = crypto.publicEncrypt(publicKey, buffer);
    return encrypted.toString('base64');
}

window.decrypt = function(data, privateKey, password) {
    let buffer = Buffer.from(data, 'base64');
    let decrypted = crypto.privateDecrypt({
        key: privateKey,
        passphrase: password
    }, buffer);
    return decrypted.toString('utf8');
}

与 UI 交互的客户端代码:

var sendMsg = function() {
    let token = $('#token').val();
    let toUser = $('#toUser').val();
    let message = btoa($('#sendMessage').val());
    fetch(`/keypairs/public/${toUser}?token=${token}`)
    .then((res) => res.json())
    .then((json) => {
        if (json.code != 200) throw 'Error';
        else return json.data.pubKey;
    })
    .then((pubKey) => encrypt(message, pubKey))
    .then((encrypted) => $('#send-result').html(encrypted))
    .catch((err) => alert(err));
};

var decryptMsg = function() {
    let token = $('#token').val();
    let encrypted = $('#decrypt-text').val();
    let password = $('#decrypt-pass').val();

    fetch(`/keypairs/private?token=${token}`)
    .then((res) => res.json())
    .then((json) => {
        if (json.code != 200) throw 'Error';
        else return json.data.privKey;
    })
    .then((privKey) => decrypt(encrypted, privKey, password))
    .then((decrypted) => $('#decrypt-result').html(decrypted))
    .catch((err) => (console.error(err), alert(err))); // <-- this line gives useless info
};

我将加密数据粘贴到字段 #'decrypt-text 中。我还传递了用户 B 的密码。在登录过程中检索 token 以将用户与数据库中的 key 相关联。正如我提到的,我得到的唯一错误是“无法解密数据”。有任何想法吗?也许我需要生成 pkcs1 类型的 key ?

最佳答案

我想通了。这个问题是当我创建公钥时,类型是 spkipkcs8。出于某种原因,将两者都更改为 pkcs1 并重新生成 key 能够修复它。我还尝试将 type: 'pkcs8 传递给解密函数,但这没有用。

关于javascript - RSA私钥无法解密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084051/

相关文章:

javascript - 使用 jQuery 迭代 JSON 对象

javascript - jQuery Ajax 调用未找到元素问题

javascript - 创建时访问对象内容

javascript - 为什么 jQuery.inArray 不适用于对象数组

javascript - 将 Away3D Canvas 分配给 var 时出现 TypeScript 错误 TS2082 和 TS2087

javascript - 如何通过 node.js 将数据从 MongoDB 传递到我的 Web api?

node.js - 让 Mongoose 重新连接到 Node 并向辅助 Node 发送请求时出现问题

Java AES 字符串解密 "given final block not properly padded"

java - 3DES 解密错误无效 key 长度

amazon-web-services - 如何通过 CLI 加密 Lambda 的环境变量?