尝试使用私钥解密邮件时出现节点rsa错误

所以我一直试图使用node -rsa和jsencrypt的 javascript来创build一个网站(为一个任务),其中JavaScript客户端获取由服务器生成的公钥(node-rsa),encryption消息(jsencrypt)用户已经进入,将其发送到服务器并获取服务器解密(node-rsa)。 密钥的生成工作,encryption工作,但解密没有。 当我启动节点脚本,我做了以下encryption…

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

当客户端请求密钥(我使用快速)时,运行以下内容。

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

客户端然后像这样保存这个键…

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

当我得到encryption和发送消息在客户端上,我这样做…

 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----- 

encryption的消息(stackoverflow)是…

 XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g== 

有趣的是,当我在jsencrypt网站上使用演示 ,并input我的私钥以及encryption的消息时,我得到了正确的解密消息。

所以我的问题是…

我在做什么错我的节点rsa解密?

如果您需要更多信息/代码,请将其写入下面的注释中。

要回答你的问题@Curious_Programmer是默认节点-RSA使用pkcs1_oaep进行encryption和解密,而jsencrypt使用pkcs1。 幸运的是节点可以让你更改encryptionScheme,你需要做的就是添加…

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

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

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

看来密文是一个缓冲区,即二进制数据。 然后使用由文本组成的JSON进行传输。 您需要对二进制数据使用文本编码,通过基于文本的界面进行传输。


检查encrypt方法的以下定义:

 key.encrypt(buffer, [encoding], [source_encoding]); 

提示默认是'buffer' [encoding]

所以你应该使用:

 var encrypted = myEncrypter.encrypt(message, 'base64', 'utf-8'); 

其中'base64'用于密文编码, 'utf-8'用于明文编码。


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

 var clearMessage = myDecrypter.decrypt(message.message, 'utf8'); 

应该没问题。

我有同样的问题。

 encrypt.setOptions({encryptingScheme:'pkcs1'});//Can be 'pkcs1_oaep' or 'pkcs1'. Default 'pkcs1_oaep'. 

但是,这仍然是失败的。

我已经将节点rsa更改为ursa。 喜欢这个:

 privateKey.decrypt(thirdEncrypted, 'base64', 'utf8',ursa.RSA_PKCS1_PADDING); 

这个问题已经在ursa中解决了。