attempting to decrypt using crypto-js and nodejs

穿精又带淫゛_ 提交于 2020-01-05 11:57:06

问题


I am communicated back and forth between a micro-controller and a nodejs tcp server. The micro-controller forms a json string with sensor data. The micro-controller then sends the json string to a WiFi module. The WiFi module then encrypts the data using AES256 with 32 character Hexadecimal characters as the key before sending the encrypted data to the nodejs tcp server.

The nodejs TCP server is using the Crypto-JS module form of the googlecode Crypto-JS.

For testing purposes I would like to output the encrypted data and decrypted data to the console. However I am unsure how do accomplish this. I attempted to output the data, but I am receiving blank data. For example, the console should read something like: 192.168.1.14:30001> some-json-string Except I am receiving 192.168.1.14:30001>

Old Code:

  // I removed the old code to shrink this post and to remove any confusion.

EDIT
I am now using the the built in crypto module supplied by NodeJS. The error I am receiving is:

crypto.js:292 var ret = this._binding.final(); ^ TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Decipher.Cipher.final (crypto.js:292:27)
at decrypt (C:\Users\joes\Desktop\encrypt\tcp.js:18:24)
at Socket. (C:\Users\joes\Desktop\encrypt\tcp.js:44:23)
at Socket.emit (events.js:95:17)
at Socket. (_stream_readable.js:748:14)
at Socket.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:410:10)
at emitReadable (_stream_readable.js:406:5)
at readableAddChunk (_stream_readable.js:168:9)
at Socket.Readable.push (_stream_readable.js:130:10)

Code:

// Load the TCP Library
net = require('net');

// Load the Crypto Module
var crypto = require("crypto");

function encrypt(key, data) {
    var cipher = crypto.createCipher('aes256', key);
    var crypted = cipher.update(data, 'utf-8', 'hex');
    crypted += cipher.final('hex');

    return crypted;
}

function decrypt(key, data) {
    var decipher = crypto.createDecipher('aes256', key);
    var decrypted = decipher.update(data, 'hex', 'utf-8');
    decrypted += decipher.final('utf-8');

    return decrypted;
}

// Keep track of the chat clients
var clients = [];

// Start a TCP Server
net.createServer(function (socket) {

// Identify this client
socket.name = socket.remoteAddress + ":" + socket.remotePort

// Put this new client in the list
clients.push(socket);

// Send a nice welcome message and announce
socket.write("Welcome " + socket.name + "\n");
broadcast(socket.name + " joined the chat\n", socket);

// Handle incoming messages from clients.
socket.on('data', function (data) {
  var key = new Buffer('85CE6CCF67FBBAA8BB13479C3A6E084D', 'hex');

  // Attempt to decrypt data with the above key
  var decryptedText = decrypt(key, data);
  //console.log("Decrypted Text: " + decrypt(key, encrypt(key, '{"resTemp":"82.19","roomTemp":98,"ph":58,"ec":700}>')));

  broadcast(socket.name + "> " + decryptedText, socket);
  //console.log(data);
});

// Remove the client from the list when it leaves
socket.on('end', function () {
  clients.splice(clients.indexOf(socket), 1);
  broadcast(socket.name + " left the chat.\n");
});
// Send a message to all clients
function broadcast(message, sender) {
  clients.forEach(function (client) {
  // Don't want to send it to sender
  if (client === sender) return;
  client.write(message);
});
// Log it to the server output too
process.stdout.write(message)
}

}).listen(5000);

// Put a friendly message on the terminal of the server.
console.log("Chat server running at port 5000\n");

data should a buffered object and contain a json string, for an example:{"resTemp":"82.19","roomTemp":98,"ph":58,"ec":700}>
The ">" is there intentionally for data flow control between the micro-controller and the wifi module. I will remove the '>' before I process the json string.


回答1:


The code using the built-in crypto module is almost correct. Notably there was a typo in encrypt() and the key needs to be a Buffer. Here's what I used:

var crypto = require('crypto');

function encrypt(key, data) {
    var cipher = crypto.createCipher('aes256', key);
    var crypted = cipher.update(data, 'utf-8', 'hex');
    crypted += cipher.final('hex');

    return crypted;
}

function decrypt(key, data) {
    var decipher = crypto.createDecipher('aes256', key);
    var decrypted = decipher.update(data, 'hex', 'utf-8');
    decrypted += decipher.final('utf-8');

    return decrypted;
}

var key = new Buffer('85CE6CCF67FBBAA8BB13479C3A6E084D', 'hex');

decrypt(key, encrypt(key, 'hello world'));

// outputs: 'hello world'


来源:https://stackoverflow.com/questions/25172527/attempting-to-decrypt-using-crypto-js-and-nodejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!