Táto forma je bezpečná z hľadiska doby prelomenia šifrovacieho kľúča, avšak nerieši autenticitu a integritu (dôvernosť) dát. Teda tento spôsob nezabezpečí prijatie a dešifrovanie podvrhnutých dát, ak spĺňajú veľkosť očakávaného payloadu.
Celá programová implementácia bude v Arduino Core pre ESP32 a využíva aj jeho hardvérový kryptografický akcelerátor pre algoritmus AES. Samotné kryptografické operácie sú vstavané v Arduino Core v knižnici mbedTLS (PolarSSL). Pre prenos dát budeme demonštrovať knižnicu Arduino_LoRa. Po stránke hardvéru využijeme devkit Lolin32 s LoRa modulom RA-02 (SX1278), ale testoval som aj na XIAO ESP32-C6.

Budeme využívať CBC režim blokovej šifry s algoritmom AES (AES-ECB). Algoritmus spracúva otvorený text po 16-bajtových blokoch.
Program využíva štruktúru 17 bajtov dát, ktorá je zarovnaná na 24 bajtov.
Kód: Vybrat vše
struct DataPacket {
double a; // 8 B
double b; // 8 B
uint8_t c; // 1 B
};
Princíp šifrovania v CBC režime blokovej šifry:
CBC využíva reťazenie blokov a teda pre optimálnu výkonnosť vyžaduje aspoň dva bloky otvoreného textu, inak je na úrovni AES-ECB, čo nie je už dnes považované za bezpečnú šifru. Prvý blok otvoreného textu sa XOR-uje s inicializačným vektorom, čo je náhodný reťazec o veľkosti bloku otvoreného textu. Inicializačný vektor musí byť pri každej správe náhodný. Výsledné dáta sú následne šifrované s (v tomto prípade) AES symetrickým kľúčom. Šifrovaný text sa XOR-uje s otvoreným textom nasledujúceho bloku a následne sa šifruje.

Spôsob dešifrovania je presne opačný. Nakoľko sa využíva symetrický AES kľúč, musí ho poznať ako vysielač, tak aj LoRa prijímač, štandardne ho majú vo svojej konfigurácii a nikdy sa neprenáša medzi zariadeniami. Inicializačný vektor bude informácia, ktorá sa bude v čitateľnej podobe prenášať medzi vysielačom a prijímačom.

Payload, ktorý pôvodne predstavoval 24 bajtov bol skrz štandard PKCS#7 zaokrúhlený na 32 bajtov. To ale nie je finálna veľkosť payloadu, nakoľko je nutné ešte prenášať inicializačný vektor ako súčasť payloadu paketu. Inicializačný vektor je kritický, nakoľko bez neho nie je možné dostať dáta v čitateľnej podobe. Celková veľkosť payloadu tak predstavuje 48 bajtov, čo v bežnej aplikácii navýši celkový vysielací čas LoRa zariadenia + potrebuje čas aj na šifrovanie a dešifrovanie, čo predĺži celkový uptime zariadenia.

Nakoľko má ESP32 kryptografický akcelerátor pre AES, samotné šifrovanie a dešifrovanie je veľmi rýchle. V prípade nahradenia algoritmu za iné so zrovnateľnou bezpečnosťou, napríklad ARIA, alebo CAMELLIA (tiež ich podporuje mbedTLS) sa šifrovanie predĺži, nakoľko ESP32 nemá kryptografický akcelerátor pre tento algoritmus. V programovej implementácii sa neoveruje, od koho paket prišiel, overuje sa len očakávaná dĺžka štrukúry po vyparsovaní inicializačného vektora.
Programová implementácia - EPS32-WROOM-32 / ESP32-C6:
- So zmenou frekvencie v programe možno použiť aj pre RFM95 s SX1276 (868 MHz)
https://deadawp.blog.sector.sk/blogclan ... kticky.htm
Výsledky:
- Pre testovanie sa posielal cyklicky identický payload
- GPS súradnice a byte hodnota
- Programová implementácia má dostupný aj príklad s náhodnymi dátami

Prijímač

Algoritmy ARIA, či CAMELLIA môžete použiť jednoducho, musíte zvoliť správny hlavičkový súbor (názov algoritmu) a následne zmeniť všetky názvy funkcií, kde sa objavuje aes na aria alebo camellia. Všetky funkcie majú identický názov pre CBC režim aj u týchto algoritmov, teda zmena algoritmu je otázka sekúnd v programovej implementácii. Môžete si tak vyskúšať aj tieto iné algoritmy, ktoré sú vstavané v mbedTLS pre ESP32.