javascript - 尝试使用私钥解密消息时出现 node-rsa 错误

标签 javascript node.js encryption cryptography node-rsa

所以我一直在尝试将 Node 与 node-rsa 一起使用和 javascript jsencrypt创建一个网站(用于作业),其中 javascript 客户端获取服务器(node-rsa)生成的公钥,加密用户输入的消息(jsencrypt),将其发送到服务器并让服务器解密它( Node rsa)。 key 的生成有效,加密有效,但解密无效。当我启动 Node 脚本时,我会执行以下加密操作......

var NodeRSA = require('node-rsa');
var myDecrypter = new NodeRSA({b: 512});

当客户端请求 key (我正在使用 express)时,将运行以下内容。

app.get('/getPublicKey', function(req, res){
    var publicKeyJson = {"Key": ""};
    console.log(myDecrypter.exportKey('public'));
    publicKeyJson.Key = myDecrypter.exportKey('public');
    res.json(JSON.stringify(publicKeyJson));
});

客户端然后像这样保存该 key ...

var myEncrypter = new JSEncrypt();
var myJson  = "";
$.getJSON( "getPublicKey", function( data ) {
    myJson = JSON.parse(data).Key;
        setKey();
});
function setKey() {
    myEncrypter.setPublicKey(myJson);
}

当我要在客户端加密和发送消息时,我会这样做......

function messageEncrypt() {
    message = document.getElementById("message").value;
    var encrypted = myEncrypter.encrypt(message);
    myMessage = {"username": "", "userId": 0.0, "message": ""};
    myMessage.username = me.username;
    myMessage.userId = me.userId;
    myMessage.message = encrypted;
    console.log(encrypted);
    $.post("sendMessage", myMessage);
}

当服务器收到一条消息时会发生这种情况,这就是我收到错误的地方。

app.post('/sendMessage', function(req, res){
    var message = req.body;
    var user = message.username;
    var id = message.userId;
    console.log("What a mess, " + user + " said " + message.message + " what on earth does that mean");
    //This line below errors
    var clearMessage = myDecrypter.decrypt(message.message, 'utf8');
    console.log(user + " said " + clearMessage);
});

我得到的错误是...

Error: Error during decryption (probably incorrect key). Original error: Error: error:040A1079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error
    at Error (native)
    at NodeRSA.module.exports.NodeRSA.$$decryptKey (/home/node_modules/node-rsa/src/NodeRSA.js:295:19)
    at NodeRSA.module.exports.NodeRSA.decrypt (/home/node_modules/node-rsa/src/NodeRSA.js:243:21)
    at /home/securechat/securechat.js:36:36
    at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/home/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/node_modules/express/lib/router/layer.js:95:5)
    at /home/node_modules/express/lib/router/index.js:277:22
    at Function.process_params (/home/node_modules/express/lib/router/index.js:330:12)

然而,这里是有趣的地方,为了得到上面的错误消息,我有一个私钥......

-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cEHmhFJB8m4bQUSTcSi4eg
sUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQJASds423cVH/c4NsqhXh8e
KvYwjBFeeNIjQegIq1KctbHmKNM5MMb4jnDqdY/S5XHHS22EGvLNheLgV8tlRjwG
UQIhANpNmbl215eOsGPJ0jqz1XPMBrO35V6I3P04kvr66R1JAiEAn+oL0jtAFETR
4PRfenye5MAu9US3V5MoDN8xUoEvKrcCIQDQT2ZWNNIrHAyzXB2QyJPxqInoqp1j
5QPDWl3ewtj5iQIgY3E1nKw/stsA8LTGUvMAFBv2l4r9wDXAaBC7KSUwYY0CIAj4
0gA9etDbPm3H/XDwK4WXs9mXkKroyxewkWoOoAw/
-----END RSA PRIVATE KEY-----

发送给客户端的公钥是...

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cE
HmhFJB8m4bQUSTcSi4egsUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQ==
-----END PUBLIC KEY-----

加密的消息(stackoverflow)是......

XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g==

有趣的是,当我使用 demo在 jsencrypt 网站上输入我的私钥以及加密的消息我得到正确的解密消息。

所以我的问题是...

我的 node-rsa 解密做错了什么???

如果您需要更多信息/代码,请将其放在下面的评论中。

最佳答案

要回答@Curious_Programmer 的问题,默认 node-rsa 使用 pkcs1_oaep 进行加密和解密,而 jsencrypt 使用 pkcs1。值得庆幸的是 Node 允许您更改加密方案,您需要做的是添加 ...

myDecrypter.setOptions({encryptionScheme: 'pkcs1'});

var myDecrypter = new NodeRSA({b: 512});

一切都会像魅力一样工作,我希望我能帮到你 ;)

关于javascript - 尝试使用私钥解密消息时出现 node-rsa 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837617/

相关文章:

javascript - 将图像添加到给定链接的表中

JavaScript按钮onclick不起作用

JavaScript WebCrypto API unwrapKey

c# - SQL Server 加密和 nhibernate

javascript - 如何将 PDF 作为二进制传递给 window.open()?

javascript - 如何使用 javascript 从对象数组和单独对象中检索属性?

node.js - 在 mac high sierra 上安装 npm

javascript - 模块导出模块不起作用

javascript - 为什么我的 promise 在循环中存在计时问题,我该如何解决?

python - 在 Python 3.6 XOR 中获取简单错误