Chiffrement AES-CTR & Format LoRa
Implémentation de l'algorithme AES-256 en mode Compteur (CTR) pour sécuriser les payloads LoRa, avec gestion des clés via Secure Element.
Principe du Chiffrement Symétrique
Pour sécuriser les échanges LoRa, nous avons opté pour un chiffrement symétrique. Contrairement au chiffrement asymétrique (lourd et lent), le symétrique est très rapide et adapté aux contraintes de temps réel des microcontrôleurs.
Fonctionnement Clé Partagée
Le principe est simple : les deux boîtiers M5Stack partagent une même clé secrète de 32 octets (256 bits). Cette clé est pré-chargée dans le Slot 8 du Secure Element et ne quitte jamais la zone sécurisée.
Avantages Clés :
- Vitesse d'exécution élevée (quelques ms)
- Faible consommation énergétique
- Complexité algorithmique réduite pour l'ESP32
AES-256-CTR
Le Mode AES-CTR (Counter)
Nous utilisons la librairie mbedTLS pour transformer le chiffrement par bloc en chiffrement par flux.
Génération IV
On génère un IV (Vecteur d'Initialisation) aléatoire de 16 octets pour chaque nouveau message. Cela garantit que deux messages identiques produiront des textes chiffrés différents.
Keystream
L'algorithme AES combine la Clé Secrète et l'IV (incrémenté) pour générer un flux de données pseudo-aléatoire (le "Keystream").
Opération XOR
Ce flux est combiné avec le message clair via une opération XOR. L'avantage majeur est que le XOR est réversible : la même fonction permet de chiffrer et de déchiffrer.
Implémentation loraEncrypt
// Extrait de notre implémentation AES-CTR static bool loraEncrypt(const String &plain, const uint8_t key[32], String &outIVb64, String &outCTb64) { // 1. Préparation des buffers size_t len = plain.length(); uint8_t bufIn[LORA_MAX_PLAINTEXT]; for (size_t i = 0; i < len; i++) bufIn[i] = plain[i]; // 2. Génération d'un IV aléatoire unique (16 octets) uint8_t iv[16]; for (int i = 0; i < 16; i++) iv[i] = random(0, 256); // 3. Chiffrement AES-CTR (mbedTLS) uint8_t cipher[LORA_MAX_PLAINTEXT]; if (!aesCtrCrypt(key, 256, iv, bufIn, len, cipher)) return false; // 4. Encodage en Base64 pour transmission LoRa outIVb64 = base64Encode(iv, 16); // IV public indispensable outCTb64 = base64Encode(cipher, len); // Message chiffré return true; }
Encapsulation du Message
Une fois chiffré, le message binaire ne peut pas être envoyé tel quel sur le réseau LoRa (qui attend souvent du texte ou a des contraintes d'encodage). Nous l'encodons en Base64 et l'insérons dans notre protocole maison au format string.
Format du Paquet Final
Intégration Complète
Nous avons le mécanisme cryptographique. Il reste à l'assembler avec la réception LoRa et l'affichage sur le M5Stack.