[sw] Šifrovanie payloadu LoRa PPP

Odpovědět
martinius96
Příspěvky: 588
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

[sw] Šifrovanie payloadu LoRa PPP

Příspěvek od martinius96 » 28 črc 2025, 01:07

Ahoj, dovolil by som si tu zazdieľať spôsob, ako je možné šifrovať payload pri posielaní vlastných LoRa správ (PPP komunikácia).
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.
Obrázek
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
};
Štandardom PKCS#7 sa vykoná zarovnanie dát na 32 bajtov pre dosiahnutie dvoch 16 - bajtových blokov, čo vyžaduje algoritmus. Pre algoritmus AES je možné zvoliť 128, 192 alebo 256-bitový symetrický kľúč. Najdlhší kľúč ponúka najvyššiu bezpečnosť, nakoľko má najvyššiu náhodnosť, keďže môže nadobúdať hodnotu z 2ˆ256 možností, čo dramaticky zvyšuje čas na bruteforce útok.

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.
Obrázek
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.
Obrázek

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.
Obrázek
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)
Detailnejší článok, kde je obšírnejší popis:
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
Vysielač
Obrázek

Prijímač
Obrázek

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.

martinius96
Příspěvky: 588
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

Re: [sw] Šifrovanie payloadu LoRa PPP

Příspěvek od martinius96 » 08 srp 2025, 01:47

Pre predstavu výhod kryptografického akcelerátora AES na ESP32 tu mám ešte jednu ukážku. Urobíme si časové porovnanie kryptografických operácii šifrovania a dešifrovania pre rôzne algoritmy. Využijeme AES a tiež ARIA (používaná v Južnej Kórei, medzinárodne uznávaný štandard) a CAMELLIA (používaná v Japonsku, medzinárodne uznávaný štandard, narazíte na neho skôr ako na ARIU). Všetky spomenuté algoritmy sa označujú ako rovnako bezpečné. Využijeme CBC režim blokovej šifry.

Budeme mať rovnaké vstupy pre všetky testované algoritmy:
  • 128-bitový symetrický kľúč
  • 8 bajtová štruktúra
  • INT (1234) a FLOAT (3.141590)
  • Zarovnanie cez PKCS#7 na 16 bajtov
Poďme sa pozrieť na výsledky a dobu šifrovania a dešifrovania identického payloadu pre rôzne algoritmy v režime CBC.

AES-CBC - šifrovanie 17 μs, dešifrovanie 18 μs
Obrázek

CAMELLIA-CBC - šifrovanie 286 μs, dešifrovanie 287 μs
Obrázek

ARIA-CBC - šifrovanie 401 μs, dešifrovanie 403 μs
Obrázek

Dĺžka behu operácie šifrovania a dešifrovania je identická v rámci algoritmu v režime CBC. Je to dáne len tým, že dešifrovanie je inverznou funkciou k šifrovaniu. Teda počet operácii a aj doba ich behu je totožná.

Zaujímavé rozdiely vidíme v časoch operácii pri porovnaní medzi algoritmami. Najkratší čas je u AES z dôvodu vstavaného kryptografického akcelerátora pre kryptografické operácie algoritmu AES v mikrokontroléri ESP32. Keďže to nemá kryptografický akcelerátor pre algoritmus ARIA a CAMELLIA, šifrovanie i dešifrovanie trvá násobne dlhšie.

CAMELLIA je voči AES pomalšia takmer 17-násobne. ARIA viac ako 23-násobne. Z pohľadu bezpečnosti dosahujeme vo všetkých troch prípadoch zrovnateľnú úroveň bezpečnosti, ale v rôznych časoch. Z pohľadu Low power aplikácii sa predlžuje celkový uptime zariadenia, i keď pre túto ukážku so 16B payloadom sú tie rozdiely zanedbateľné, keďže operácie trvajú pod 1 ms. Pri šifrovaní obrovských payloadov by sa rozdiely plne ukázali, čo by malo vplyv aj na celkovú výdrž zariadenia na batériu. Vtedy je možné spotrebu optimalizovať zvolením vhodného algoritmu, ktorý zníži celkový uptime čas zariadenia.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti