1 year ago
#6760

sys-256
Error: Encrypted message length is invalid. - Websocket messes up RSA encrypted data
For my new project I wanted to use RSA public/private key encryption for the WebSocket API to ensure security. I use node.js v16 with the ws package (to handle connections) and node-forge (to generate the keypairs, encrypt, decrypt, etc).
When I generate keypairs, convert to pem, encrypt with the public then decrypt with the private key, everything works. However when I try to send the encrypted message over WebSocket to the server (as the client, chrome), the server (which tries to decrypt it) gives me Error: Encrypted message length is invalid.
This is my trace log:
/home/user/directory/node_modules/node-forge/lib/rsa.js:544
throw error;
^
Error: Encrypted message length is invalid.
at Object.pki.rsa.decrypt (/home/user/directory/node_modules/node-forge/lib/rsa.js:541:17)
at Object.key.decrypt (/home/user/directory/node_modules/node-forge/lib/rsa.js:1183:21)
at WebSocket.<anonymous> (/home/user/directory/src/websocket.js:28:58)
at WebSocket.emit (node:events:402:35)
at Receiver.receiverOnMessage (/home/user/directory/node_modules/ws/lib/websocket.js:1098:20)
at Receiver.emit (node:events:390:28)
at Receiver.dataMessage (/home/user/directory/node_modules/ws/lib/receiver.js:528:14)
at Receiver.getData (/home/user/directory/node_modules/ws/lib/receiver.js:446:17)
at Receiver.startLoop (/home/user/directory/node_modules/ws/lib/receiver.js:148:22)
at Receiver._write (/home/user/directory/node_modules/ws/lib/receiver.js:83:10) {
length: 138,
expected: 64
}
I've countlessly tried using forge.util.encode64/decode64 and forge.util.encodeUtf8/decodeUtf8 function to fix the issue, but the fact that WebSocket messes up the encoding due which the message length increases stays.
This is the code I use:
const forge = require("node-forge");
module.exports = (socket) => {
socket.on("message", (message_buffer) => {
const message = message_buffer.toString();
if (message === "REGI") {
forge.pki.rsa.generateKeyPair({
"bits": 2048,
"workers": -1,
"workerScript": "https://cdnjs.cloudflare.com/ajax/libs/forge/0.10.0/prime.worker.min.js"
}, (err, keypair) => {
if (err) {
console.error(err);
socket.send("An error occurred while generating the keypair.");
socket.close();
return;
}
socket.send((forge.pki.publicKeyToPem(keypair.publicKey)).replace(/(\r\n|\n|\r)/gm, ""));
socket.on("message", (message_buffer) => {
const message = message_buffer.toString();
const decrypted = keypair.privateKey.decrypt(forge.util.encodeUtf8(message));
socket.send(decrypted);
});
});
}
});
};
Could anyone help me? Thanks in advance!
websocket
rsa
node-forge
0 Answers
Your Answer