I've managed to get him to encrypt and decrypt from (Node-Arduino).
From node I can also encrypt, but when I want to decrypt from arduino, it gets incorrect characters. In the code you can find both encryption and decryption of arduno and node.
Arduino -> Node:
Encrypt Arduino:
Original menssage: "{ 'switchOnCooler': 'true' }"
data: Ww5DkZXWXN3c9QDy4iEYQwfSP8wipQXuWZgJy567ZQdt9xL40WhAyGJsAAXAldun
iv: MTIzNDU2Nzg5MDEyMzQ1AA==
Decrypt Node:
{ 'switchOnCooler': 'true' }
Node -> Arduino:
Encrypt Node:
Original menssage: "{'info': 'Hello stackoverflow'}"
data: X6iXoxLdLItG3MmQ3Y407lwUYJW+T0Nwu7AIA5GDS+fSCK08KBycP0iNUy3x3AvU
IV: 987654321098765
Decrypt Arduino:
{'info': ⸮⸮⸮llo stackoverflow'}
Could someone help me?
Node Code:
var CryptoJS = require("crypto-js");
var AESKey = '2B7E151628AED2A6ABF7158809CF4F3C';
//----- FUNCTIONS --------
function decryptMessage(esp8266_iv, esp8266_msg) {
var plain_iv = new Buffer( esp8266_iv , 'base64').toString('hex');
var iv = CryptoJS.enc.Hex.parse( plain_iv );
var key= CryptoJS.enc.Hex.parse( AESKey );
console.log("Let's ");
// Decrypt
try {
var bytes = CryptoJS.AES.decrypt( esp8266_msg, key , { iv: iv} );
var plaintext = bytes.toString(CryptoJS.enc.Base64);
var decoded_b64msg = new Buffer(plaintext , 'base64').toString('ascii');
var decoded_msg = new Buffer( decoded_b64msg , 'base64').toString('ascii');
console.log("Decryptedage: ", decoded_msg);
var aux2 = JSON.parse(decoded_msg)
return aux2
}catch(error) {
console.log("ERROR decrypt")
}
}
function encryptMessage(messagePlain) {
console.log("-----------------------")
console.log("---- EncryptMessage ---")
console.log("-----------------------")
try {
var key = CryptoJS.enc.Hex.parse(AESKey);
var ivPlain = "987654321098765" // static IV
var ivHex = CryptoJS.enc.Base64.parse(ivPlain);
var txtBase64 = new Buffer(messagePlain).toString('base64') // ENCODE BASE 64 TEXT
var encrypted = CryptoJS.AES.encrypt(txtBase64, key , { iv: ivHex });
encrypted.toString(CryptoJS.enc.base64)
var request = require("request");
var url = 'http://192.168.1.41/info?'+encrypted.toString()+'&'+ivPlain
console.log("url ",url)
request(url, function (error, response, body) {
console.log("Finish GET ")
})
}catch(error) {
console.log("error ENCRYPT: "+error)
}
}
Arduino code:
#include "AES.h"
#include <b64.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
#include <WiFiUdp.h>
AES aes;
AES aesDecript;
BaseS base64;
// The unitialized Initialization vector
byte my_iv[N_BLOCK] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char b64data[200];
byte cipher[1000];
byte cipherDecrypt[1000];
byte iv [N_BLOCK] ;
byte key[] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C };
........
void encriptInfo(String message) {
Serial.println ("==================================================");
Serial.println ("================== ENCRYPT ===================");
Serial.println ("==================================================");
// IV
String ivRandom = "1234567890123456";
byte ivByteArray[ivRandom.length()];
ivRandom.getBytes(ivByteArray, ivRandom.length());
char b64dataIV[200];
base64.b64_encode( b64dataIV, (char *)ivByteArray, N_BLOCK);
String iv = String(b64dataIV);
Serial.println ("IV: " + iv);
// encript message
int b64len = base64.b64_encode(b64data, (char *)message.c_str(),message.length());
aes.do_aes_encrypt((byte *)b64data, b64len , cipher, key, 128, ivByteArray);
// DATA encripted
base64.b64_encode(b64data, (char *)cipher, aes.get_size() );
String data = String(b64data);
Serial.println ("Data: " + data);
request(data, iv);
}
void decrypt(String b64data, String IV_base64) {
Serial.println ("==================================================");
Serial.println ("================== DE- CRYPT =================");
Serial.println ("==================================================");
char data_decoded[300];
char iv_decoded[300];
byte out[300];
char temp[300];
// data
b64data.toCharArray(temp, 300);
int encrypted_length = base64.b64_decode(data_decoded, (char *)b64data.c_str(), b64data.length());
// IV
IV_base64.toCharArray(temp, 300);
base64.b64_decode(iv_decoded, temp, IV_base64.length());
// DECRIPT
aes.do_aes_decrypt((byte *)data_decoded, 50, out, key, 128, (byte *)iv_decoded);
char message[100];
base64.b64_decode(message, (char *)out, aes.get_size());
String plain_text = String(message);
Serial.println("messageUT");
Serial.println(message);
}