首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用私钥解密消息时出现node-rsa错误

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

Stack Overflow用户
提问于 2015-11-21 07:13:59
回答 3查看 13K关注 0票数 7

所以我一直在尝试在node-rsa中使用node,在jsencrypt中使用javascript来创建一个网站(对于一个任务),在这个网站中,javascript客户端获取服务器生成的公钥(node-rsa),对用户输入的消息(jsencrypt)进行加密,将其发送到服务器并让服务器对其进行解密(node-rsa)。密钥的生成起作用了,加密起作用了,而解密却不行。

代码语言:javascript
复制
var NodeRSA = require('node-rsa');
var myDecrypter = new NodeRSA({b: 512});

当客户端请求密钥时(我使用的是express),将运行以下代码。

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

然后,客户端将该密钥保存为...

代码语言:javascript
复制
var myEncrypter = new JSEncrypt();
var myJson  = "";
$.getJSON( "getPublicKey", function( data ) {
    myJson = JSON.parse(data).Key;
        setKey();
});
function setKey() {
    myEncrypter.setPublicKey(myJson);
}

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

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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);
});

我得到的错误是...

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cEHmhFJB8m4bQUSTcSi4eg
sUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQJASds423cVH/c4NsqhXh8e
KvYwjBFeeNIjQegIq1KctbHmKNM5MMb4jnDqdY/S5XHHS22EGvLNheLgV8tlRjwG
UQIhANpNmbl215eOsGPJ0jqz1XPMBrO35V6I3P04kvr66R1JAiEAn+oL0jtAFETR
4PRfenye5MAu9US3V5MoDN8xUoEvKrcCIQDQT2ZWNNIrHAyzXB2QyJPxqInoqp1j
5QPDWl3ewtj5iQIgY3E1nKw/stsA8LTGUvMAFBv2l4r9wDXAaBC7KSUwYY0CIAj4
0gA9etDbPm3H/XDwK4WXs9mXkKroyxewkWoOoAw/
-----END RSA PRIVATE KEY-----

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

代码语言:javascript
复制
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cE
HmhFJB8m4bQUSTcSi4egsUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQ==
-----END PUBLIC KEY-----

加密消息(堆栈溢出)是...

代码语言:javascript
复制
XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g==

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

所以我的问题是。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-22 04:11:22

要回答您的问题,请默认@Curious_Programmer -rsa使用pkcs1_oaep进行加密和解密,而jsencrypt使用pkcs1。谢天谢地,node允许您更改encryptionScheme,您需要做的是添加...

代码语言:javascript
复制
myDecrypter.setOptions({encryptionScheme: 'pkcs1'});

在……下面

代码语言:javascript
复制
var myDecrypter = new NodeRSA({b: 512});

一切都会很顺利,我希望我能帮助你;)

票数 11
EN

Stack Overflow用户

发布于 2015-11-21 19:11:57

密文似乎是一个缓冲区,即二进制数据。然后使用JSON传输,JSON由文本组成。您需要在二进制数据上使用文本编码,以便通过基于文本的接口传输它。

检查encrypt方法的以下定义:

代码语言:javascript
复制
key.encrypt(buffer, [encoding], [source_encoding]);

并提醒您[encoding]的默认值为'buffer'

所以你应该使用:

代码语言:javascript
复制
var encrypted = myEncrypter.encrypt(message, 'base64', 'utf-8');

其中'base64'表示密文编码,'utf-8'表示明文编码。

解密例程应自动使用密文的base64解码:

代码语言:javascript
复制
var clearMessage = myDecrypter.decrypt(message.message, 'utf8');

应该没问题。

票数 1
EN

Stack Overflow用户

发布于 2017-04-19 18:37:43

我也有同样的问题。

代码语言:javascript
复制
encrypt.setOptions({encryptingScheme:'pkcs1'});  //Can be 'pkcs1_oaep' or 'pkcs1'. Default 'pkcs1_oaep'.

但是,它仍然失败了。

我已经将lib从node-rsa改为ursa,如下所示:

代码语言:javascript
复制
privateKey.decrypt(thirdEncrypted, 'base64', 'utf8',ursa.RSA_PKCS1_PADDING);

该问题已在ursa中得到解决。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33837617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档