(Решено) AES шифрование-дешифрование двухстороннее (Arduino -> Node, Node -> Arduino) - PullRequest
2 голосов
/ 12 апреля 2020

Мне удалось заставить его шифровать и дешифровать с (Node-Arduino).

С узла я также могу шифровать, но когда я хочу расшифровать с Arduino, он получает неправильные символы. В коде вы можете найти как шифрование, так и дешифрование arduno и узла.

Arduino -> Node:

Encrypt Arduino :

Исходное сообщение: "{'switchOnCooler': 'true'}"

данные: Ww5DkZXWXN3c9QDy4iEYQwfSP8wipQXuWZgJy567ZQdt9xL40WhAyG * 101 * 21 * * 101 * 10 1021 * Узел расшифровки :

{'switchOnCooler': 'true'}

Узел -> Arduino :

Encrypt Node :

Исходное сообщение: "{'info': 'Hello stackoverflow'}"

data: X6iXoxLdLItG3MmQ3Y407lwUYJW + T0Nwu7AIA508KUYC03VYU3PyUc3yGyP3S3P3PHUF3P3P3VC3PHUF3PHUF3P3BYBYC3B3B3B3B3BYB3B3BVYBHYBYBYBYB3S3BYBYB3B3B3B3BYB3S3B3UB3BYB3BYB3B3S3B3UB3BYB3S3B3UB3BYB3S3B3UB3VYB3C3B3VY5PV *

IV: 987654321098765

Расшифровать Arduino :

{'info': lollo stackoverflow '}

Может ли кто-нибудь мне помочь?

Код узла:

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:

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