尝试使用私钥解密消息时出现 node-rsa 错误
node-rsa errors when trying to decrypt message with private key
所以我一直在尝试使用带有 node-rsa and javascript with jsencrypt 的节点来创建一个网站(用于分配),其中 javascript 客户端获取服务器生成的 public 密钥( node-rsa),将用户输入的消息(jsencrypt)加密,发送到服务器,让服务器解密(node-rsa)。密钥的生成有效,加密有效,但解密无效。当我启动节点脚本时,我会执行以下加密操作...
var NodeRSA = require('node-rsa');
var myDecrypter = new NodeRSA({b: 512});
客户端请求密钥时(我用的是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));
});
客户端然后像这样保存该密钥...
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-----
并且发送给客户端的 public 密钥是...
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cE
HmhFJB8m4bQUSTcSi4egsUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQ==
-----END PUBLIC KEY-----
加密消息 (Whosebug) 是...
XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g==
有趣的是,当我在 jsencrypt 网站上使用 demo 并输入我的私钥和加密消息时,我得到了正确的解密消息。
所以我的问题是...
我的 node-rsa 解密做错了什么???
如有需要information/code请在下方留言。
看来密文是一个缓冲区,即二进制数据。然后使用由文本组成的 JSON 进行传输。您需要对二进制数据使用文本编码以通过基于文本的界面传输它。
检查 encrypt
方法的以下定义:
key.encrypt(buffer, [encoding], [source_encoding]);
提醒一下,[encoding]
的默认值为 'buffer'
。
所以你应该使用:
var encrypted = myEncrypter.encrypt(message, 'base64', 'utf-8');
其中'base64'
为密文编码,'utf-8'
为明文编码。
解密例程应自动使用密文的base64解码:
var clearMessage = myDecrypter.decrypt(message.message, 'utf8');
应该没问题。
回答你的问题@Curious_Programmer默认node-rsa使用pkcs1_oaep进行加密和解密,而jsencrypt使用pkcs1。值得庆幸的是节点允许您更改加密方案,您需要做的是添加 ...
myDecrypter.setOptions({encryptionScheme: 'pkcs1'});
低于
var myDecrypter = new NodeRSA({b: 512});
一切都会顺利进行,希望对您有所帮助 ;)
我遇到了同样的问题。
encrypt.setOptions({encryptingScheme:'pkcs1'}); //Can be 'pkcs1_oaep' or 'pkcs1'. Default 'pkcs1_oaep'.
但是,还是失败了。
我已将库从 node-rsa
更改为 ursa
,如下所示:
privateKey.decrypt(thirdEncrypted, 'base64', 'utf8',ursa.RSA_PKCS1_PADDING);
问题已在 ursa
中解决。
所以我一直在尝试使用带有 node-rsa and javascript with jsencrypt 的节点来创建一个网站(用于分配),其中 javascript 客户端获取服务器生成的 public 密钥( node-rsa),将用户输入的消息(jsencrypt)加密,发送到服务器,让服务器解密(node-rsa)。密钥的生成有效,加密有效,但解密无效。当我启动节点脚本时,我会执行以下加密操作...
var NodeRSA = require('node-rsa');
var myDecrypter = new NodeRSA({b: 512});
客户端请求密钥时(我用的是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));
});
客户端然后像这样保存该密钥...
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-----
并且发送给客户端的 public 密钥是...
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIhdx31QICGN1LKRW4WngeL3RtzPh7cE
HmhFJB8m4bQUSTcSi4egsUvMeZkWyaF9gOxtZKzk5TI6q+8hg8TY6S8CAwEAAQ==
-----END PUBLIC KEY-----
加密消息 (Whosebug) 是...
XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g==
有趣的是,当我在 jsencrypt 网站上使用 demo 并输入我的私钥和加密消息时,我得到了正确的解密消息。
所以我的问题是...
我的 node-rsa 解密做错了什么???
如有需要information/code请在下方留言。
看来密文是一个缓冲区,即二进制数据。然后使用由文本组成的 JSON 进行传输。您需要对二进制数据使用文本编码以通过基于文本的界面传输它。
检查 encrypt
方法的以下定义:
key.encrypt(buffer, [encoding], [source_encoding]);
提醒一下,[encoding]
的默认值为 'buffer'
。
所以你应该使用:
var encrypted = myEncrypter.encrypt(message, 'base64', 'utf-8');
其中'base64'
为密文编码,'utf-8'
为明文编码。
解密例程应自动使用密文的base64解码:
var clearMessage = myDecrypter.decrypt(message.message, 'utf8');
应该没问题。
回答你的问题@Curious_Programmer默认node-rsa使用pkcs1_oaep进行加密和解密,而jsencrypt使用pkcs1。值得庆幸的是节点允许您更改加密方案,您需要做的是添加 ...
myDecrypter.setOptions({encryptionScheme: 'pkcs1'});
低于
var myDecrypter = new NodeRSA({b: 512});
一切都会顺利进行,希望对您有所帮助 ;)
我遇到了同样的问题。
encrypt.setOptions({encryptingScheme:'pkcs1'}); //Can be 'pkcs1_oaep' or 'pkcs1'. Default 'pkcs1_oaep'.
但是,还是失败了。
我已将库从 node-rsa
更改为 ursa
,如下所示:
privateKey.decrypt(thirdEncrypted, 'base64', 'utf8',ursa.RSA_PKCS1_PADDING);
问题已在 ursa
中解决。