Lately I discovered these nice little LoRa boards that make it possible to transmit data over the air on an open frequency without the need to have an extra SIM-card and a cellular data network. They promise up to 10km range so I knew that this would be my new playground :-)
Basically with LoRa you just send out data in clear-text on a predefined channel and everyone else that listens on that channel can read it. Not very safe. Actually not safe at at.
I also learned about LoRaWan that already solves a lot of these problems – especially encryption, addressing and lots more. But at the place where I wanted to deploy LoRa is no LoRaWan coverage and I also did not want to buy+operate a LoRaWan gateway there.
So I decided to build my own LoRa infrastructure. It consists of some nodes sending data via LoRa and another node (my “LoRa Gateway”) listening to them and forwarding the data to my web-backend via WiFi.
I’m using the ESP8266-12 modules programmed via Arduino on both sides as there is already a broad variety of libraries and a big and helping community.
After initial data transmission from the sensor-node to the web-backend finally was working I started to play around with encrypting the payload. There are already a lot of libraries to encrypt and decrypt data on the Arduino that work great. But I did not find a lot of examples to encrypt on the Arduino and decrypt on a webserver.
One that was quite promising was the one that I found here: https://github.com/kakopappa/arduino-esp8266-aes-encryption-with-nodejs. It uses AES-128-CBC and was the first example project that I got working for my requirement to encrypt on the ESP8266 and decrypt on another platform – a big thanks to https://github.com/kakopappa :-)
The only problem was that it is using nodejs to decrypt the data but my webhost only supports php. So I wrote a php-port of the decryption part:
<?php
function decryptAes($aesKey, $ivB64, $msgB64){
$plain_iv = bin2hex(base64_decode($ivB64));
$iv = hex2bin($plain_iv);
$key = hex2bin($aesKey);
$bytes = openssl_decrypt($msgB64, "AES-128-CBC", $key, $options=0, $iv);
$plaintext = base64_encode($bytes);
$decoded_b64msg = base64_decode($plaintext, true);
return base64_decode($decoded_b64msg, true);
}
?>
Sample usage:
<?php
$aesKey = "2B7E151628AED2A6ABF7158809CF4F3C";
$ivB64 = "iv-in-base64";
$msgB64 = "msg-in-base64";
$decryptedMsg = decryptAes($aesKey, $ivB64, $msgB64);
echo $decryptedMsg;
?>
Of course you need to change the $aesKey to the one you have used. The key you see here is the same as in the library of https://github.com/kakopappa. The key is defined as a HEX-String, the IV and message are given Base64-Encoded.
Hi JOHANNES, very glad to see your example code. I’ve tried using mcrypt on PHP to decrypt a B64 message from an ESP32 but in vain. It would be much appreciated if you can share the code on the Arduino side for handling the encryption and B64 encoding. Many thanks.
Hi! You can find the Arduino side with code examples that I also used at https://github.com/kakopappa/arduino-esp8266-aes-lib
Dear JOHANNES, may I make a few remarks for other’s reference? The example code of Kakopappa works with your code. However, if the msgB64 and ivB64 are passed to a PHP by GET method, the “+”, “-” and “=” symbols in the URL have to be encoded to %2B, %2D, %3D respectively for a correct submission.
Example code of Kakopappa (aes_encryption.ino):
https://github.com/kakopappa/arduino-esp8266-aes-encryption-with-nodejs
right – makes sense. but payloads that big should be transmitted via POST anyway ;-)
hello, your example is the best and all I have found … please, I need encryption from the server (PHP) to the ESP32 board. Please don’t have an example. thank Hugo
hi hugo. Unfortunatelly I have never needed the other way around. Maybe you can find hints on kokopapas github how to do that (https://github.com/kakopappa/arduino-esp8266-aes-lib). once you have managed to encrypt via php – feel free to come back so I can complete this post :-)
bonjour je suis en train de faire un communication sécurisée entre deux nœuds LoRa
y a t-il des lib arduino qui permettent de faire un communication qui met en évidence l’authentification , confidentialité et l’integrité de données entre les noeuds lora