2015-11-20 32 views
6

Vì vậy, tôi đã cố gắng sử dụng nút với node-rsa và javascript với jsencrypt để tạo trang web (cho bài tập), nơi ứng dụng javascript nhận khóa công khai do server (node-rsa), mã hóa thông điệp (jsencrypt) mà người dùng đã nhập, gửi nó tới máy chủ và nhận máy chủ giải mã nó (node-rsa). Thế hệ của các phím hoạt động, mã hóa hoạt động tuy nhiên giải mã không. Khi tôi bắt đầu tập lệnh nút, tôi thực hiện các thao tác sau để mã hóa ...lỗi node-rsa khi cố gắng giải mã tin nhắn bằng khóa riêng

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

Khi khách hàng yêu cầu khóa (tôi đang sử dụng chuyển phát nhanh) sau đây được chạy.

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

Khách hàng sau đó tiết kiệm mà quan trọng như thế này ...

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

Khi tôi để mã hóa và gửi tin nhắn trên máy khách Tôi làm điều này ...

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); 
} 

Khi máy chủ nhận được một tin nhắn thì đây là những gì xảy ra, đây là nơi tôi gặp lỗi.

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); 
}); 

Các lỗi tôi nhận được là ...

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) 
tuy nhiên

Đây là nơi nó được thú vị, để có được điều đó thông báo lỗi trên tôi đã có một khóa bí mật của ...

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

và khóa công khai được gửi cho khách hàng là ...

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

Các thông điệp được mã hóa (stackoverflow) là ...

XDViV0InCSnpyBxbNu5Herut0JYSsp87buvhzM4g2f9z3khIx2zA8Ou0Uq0TtmqtvBBVtZi5wZbcS6em/vB78g== 

Điều thú vị là khi tôi đã sử dụng demo trên trang web jsencrypt và nhập khóa bí mật của tôi cũng như thông điệp được mã hóa Tôi nhận được thông báo giải mã chính xác.

Vì vậy, câu hỏi của tôi là ...

Tôi đang làm gì sai với giải mã node-rsa ???

Nếu bạn cần thêm thông tin/mã, vui lòng nhập thông tin vào phần bình luận bên dưới.

+0

Có lẽ b/c ví dụ của bạn là phức tạp. Làm cho nó đơn giản hơn và cung cấp cho chúng tôi một lỗi jsfiddle.net – Oleander

Trả lời

9

Để trả lời câu hỏi của bạn @Curious_Programmer là nút mặc định-rsa sử dụng pkcs1_oaep để mã hóa và giải mã trong khi jsencrypt sử dụng pkcs1. Rất may nút cho phép bạn thay đổi encryptionScheme, những gì bạn cần làm là thêm ...

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

dưới

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

và tất cả sẽ làm việc như một say mê, tôi hy vọng tôi đã giúp bạn;)

+0

Tôi cảm ơn sự giúp đỡ M8 :) –

1

Dường như bản mã là bộ đệm, tức là dữ liệu nhị phân. Sau đó, nó được vận chuyển bằng JSON, bao gồm văn bản. Bạn cần phải sử dụng mã hóa văn bản trên dữ liệu nhị phân để chuyển nó qua giao diện dựa trên văn bản.


Kiểm tra các định nghĩa sau đây của phương pháp encrypt:

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

với lời nhắc nhở rằng mặc định là 'buffer' cho [encoding].

Vì vậy, bạn nên sử dụng:

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

nơi 'base64' là dành cho mã hóa ciphertext và 'utf-8' là dành cho mã hóa plaintext.


Những thói quen giải mã sẽ tự động sử dụng base64 giải mã bản mã:

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

nên được tốt.

0

Tôi có cùng một vấn đề.

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

nhưng điều này vẫn không thành công.

Tôi đã thay đổi lib từ nút-rsa thành ursa. như sau:

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

Sự cố đã được giải quyết trong ursa.

Các vấn đề liên quan