Projekt Czarny Łabędź. Jednokierunkowy, bezpieczny komunikator bezprzewodowy

Projekt Czarny Łabędź. Jednokierunkowy, bezpieczny komunikator bezprzewodowy

W dzisiejszych czasach może się to wydawać niemożliwe, jednak załóżmy, że doszło do zdarzenia, powodującego ogólnokrajowy blackout, całkowitą awarię sieci komórkowej i innych systemów komunikacji. Wtedy przestaną działać wszystkie elektroniczne środki komunikacji, może z wyjątkiem klasycznych systemów radiowych i Bluetooth… Jest jeszcze jedno rozwiązanie, które zaprezentowano w tym artykule.

Projekt Black Swan (Czarny Łabędź) to bezpieczny, jednokierunkowy kanał komunikacyjny zbudowany na module ESP8266. Nie jest tak, że to proste urządzenie natychmiast naprawi sytuację i rozwiąże wszystkie problemy blackoutu, ale przynajmniej pozwoli wysłać krótką wiadomość do rodziny lub sąsiada. Ponadto urządzenie ma zaimplementowane funkcje kryptograficzne – silny algorytm szyfrowania jest odporny zarówno na podsłuchiwanie, jak i manipulację danymi. To bardzo ciekawe zagadnienie, a implementacja takich rozwiązań w prostym urządzeniu jest idealną okazją do nauki tworzenia systemów szyfrujących tego rodzaju.

System ten składa się z dwóch modułów – nadajnika i odbiornika. Działają one w parze i pozwalają na zestawienie bezpiecznego kanału komunikacyjnego. Po skonfigurowaniu urządzenie może działać całkowicie autonomicznie, bez konieczności podłączania do komputera.

Potrzebne elementy

Do budowy nadajnika potrzebne są następujące elementy i moduły:

  • mikrokontroler ESP8266,
  • ekran LCD TFT o przekątnej 1,77” ze sterownikiem ST7735,
  • płytka z mikrokontrolerem, kompatybilna z Arduino Nano lub Uno,
  • klawiatura z interfejsem PS/2 oraz złącze PS/2 do podłączenia klawiatury,
  • opornik 580 Ω.

Do budowy odbiornika potrzebne są natomiast:

  • mikrokontroler ESP8266,
  • wyświetlacz z telefonu Nokia 5110.

Oprócz wymienionych komponentów potrzebne będą elementy połączeniowe – przewody, płytka stykowa itp. do połączenia ze sobą wszystkich elementów.

Algorytm szyfrowania

W urządzeniu zastosowano algorytm symetryczny. Oznacza to, że ten sam klucz jest używany zarówno do szyfrowania, jak i odszyfrowywania danych. Dlatego ilekroć piszemy klucz, mamy na myśli zarówno klucz szyfrujący, jak i deszyfrujący. Autor konstrukcji dołożył wszelkich starań, aby dane przesyłane bezprzewodowo nie mogły zostać ani odszyfrowane, ani zmodyfikowane przez osoby trzecie, które mogłyby podsłuchiwać komunikację. Nawet jeśli osoba trzecia dostanie szansę przechwycenia paczki i wysłania jej ponownie (wykona tak zwany atak typu replay), mając jednocześnie możliwość patrzenia na ekran odbiornika, bez dostępu do pamięci urządzenia, urządzenie nie odszyfruje przesłanego pakietu, ponieważ zmienią się jego parametry, co system wykrywa.

System jest odporny też przed atakami z wybranym tekstem jawnym. Nawet jeśli wielokrotnie zaszyfrujemy ten sam tekst jawny, za każdym razem otrzymamy inne szyfrogramy. Aby to osiągnąć, w systemie połączono trzy silne kryptograficznie algorytmy szyfrowania z tzw. S-boxami Rijndael i czterema wektorami inicjalizacji.

Aby lepiej zrozumieć algorytm szyfrowania, na czas jego omawiania możemy podzielić go na elementy składowe, które omówimy niezależnie:

  • 3DES (który sam w sobie jest kaskadowym algorytmem szyfrowania) z AES-256 i szyfrowaniem za pomocą algorytmu Serpent. Są to dobrze znane algorytmy szyfrowania. Wystarczy wpisać w wyszukiwarce którykolwiek z nich, aby znaleźć komplet informacji na temat każdego z nich.
  • Rijndael (AES) S-box jest częścią standardu AES. Zastosowano go jako osobny element. Jego celem jest zwiększenie entropii szyfrogramu.
  • Wektor inicjujący (IV) – jest to liczba używana zarówno w procesie szyfrowania, jak i deszyfrowania. Jej podstawowym celem jest wyeliminowanie możliwości ataku replay. Poza tym IV służy w pewnym sensie jako część klucza.
  • Operacja logiczna XOR. Nie wymaga raczej tłumaczenia, tym bardziej że w Internecie można bez problemu znaleźć jej kompletną definicję.
  • Proces szyfrowania przebiega następująco:
  1. Zwykły tekst jest dzielony na 64-bitowe bloki (8 znaków). Jeśli długość bloku jest mniejsza niż 64 bity, stosowane jest dopełnienie. Bloki są następnie przekazywane do algorytmu szyfrowania, który rozpoczyna się w kroku N2 i szyfruje bloki jeden po drugim (od pierwszego nadesłanego).
  2. Blok jest dzielony na osiem równych części.
  3. Każda część bloku przechodzi przez Rijndael S-box „w przód”.
  4. Osiem wyjść z S-boxów jest sklejanych ze sobą (konkatenowanych) i wykonywana jest operacja XOR pomiędzy wynikiem konkatenacji a pierwszym IV.
  5. 64-bitowa wartość pobrana z poprzedniego kroku jest szyfrowana za pomocą algorytmu 3DES.
  6. Następnie wartość wygenerowana przez szyfrowanie 3DES jest dzielona na 8 równych części (po 8 bitów każda) i przechodzi przez osiem S-boxów.
  7. Osiem wyjść z S-boxów z poprzedniego kroku ponownie podlega konkatenacji i działaniu XOR, tym razem z drugim IV.
  8. 64 losowe bity są łączone z 64 bitami z poprzedniego kroku.
  9. Otrzymana 128-bitowa wartość jest szyfrowana za pomocą algorytmu AES-256.
  10. Wartość wygenerowana przez algorytm AES-256 jest dzielona na dwie równe, 64-bitowe części.
  11. Lewa połowa wartości wygenerowanej przez AES-256 podlega działaniu XOR z trzecim IV, podczas gdy prawa połowa tej wartości podlega działaniu XOR z czwartym IV.
  12. 64 losowe bity są łączone z każdą połową XOR z IV, tworząc w ten sposób dwie 128-bitowe wartości.
  13. Każda 128-bitowa wartość jest szyfrowana algorytmem Serpent.
  14. Wartości generowane przez algorytm Serpent są jednocześnie wysyłane do odbiorcy.
  15. Po wysłaniu następuje inkrementacja kluczy AES i 3DES oraz inkrementacja IV. Jeśli nie jest to ostatni blok, następuje powrót do kroku N2 i do algorytmu podawany jest kolejny blok tekstu.

Diagramy pokazujące algorytm szyfrowania i deszyfrowania zamieszczono na rysunku 1 w postaci schematu blokowego.

Rysunek 1. Schemat blokowy algorytmu szyfrowania (po lewej) i deszyfrowania (po prawej)

Biblioteki i drivery dla Arduino IDE

Jeśli to nasz pierwszy projekt na układzie ESP8266, to konieczne jest odpowiednie skonfigurowanie Arduino IDE oraz zainstalowanie potrzebnych sterowników. Jeśli nie mamy zainstalowanego środowiska programistycznego Arduino, to zacznijmy od jego zainstalowania, a następnie doinstalujmy na komputerze sterowniki do konwerterów USB-UART – na ogół jest to CH340 lub układ z rodziny CP210x. W zależności od tego, z jakim mamy do czynienia w zastosowanym przez nas module, zainstalujmy odpowiedni z nich.

Następnie konfigurujemy Arduino IDE do współpracy z naszym modułem ESP8266. Jeśli występuje taka konieczność, pobieramy z sieci odpowiednie pliki dla Arduino (poprzez wbudowany menedżer konfiguracji Arduino IDE). W zależności od zastosowanego modułu, instalujemy odpowiednią konfigurację. Z uwagi na ogromną liczbę modułów z tym mikrokontrolerem, jaka dostępna jest na rynku, w artykule nie opisujemy dokładniej konfiguracji IDE.

Finalnie musimy zainstalować wszystkie zewnętrzne biblioteki, jakie potrzebne są do działania programu. Da się je pobrać z GitHuba z ich repozytoriów (patrz linki poniżej). Proces rozpakowywania bibliotek jest bardzo prosty. Zawartość archiwum pobranego z repozytorium można rozpakować do folderu: ...\Arduino\libraries lub można otworzyć Arduino IDE, kliknąć Sketch → Include Library → Add .ZIP Library i wybrać każde archiwum z bibliotekami. Projekt Black Swan do działania będzie potrzebował:

Inne wymagane biblioteki są już obecne w Arduino IDE, więc nie ma potrzeby ich instalowania.

Generowanie kluczy

Losowanie wartości IV

Urządzenie wymaga do działania pięciu 8-cyfrowych liczb – czterech IV i jednego numeru inicjującego. Liczby te można generować w dowolny możliwy sposób. Autor konstrukcji postanowił rzucić kostką 20-ścienną. Algorytm, jaki zastosował, jest prosty: po rzuceniu kostką zapisujemy ostatnią cyfrę wylosowanej liczby, jeśli jest ona liczbą dwucyfrową lub zapisujemy wylosowaną liczbę jednocyfrową. Powtarzamy to osiem razy, aby uzyskać całą liczbę. Takie losowanie powtarzamy osiem razy. Rzucanie kością jest całkiem dobrym rozwiązaniem, jako że rzut kością jest rzeczywiście losowy.

Ostatecznie autor wylosował następujące 8-cyfrowe liczby: 46201651, 60523847, 13453694, 31216946, 40282533. Maksymalna wartość liczby to 99999999. Jeśli podczas generowania (dowolną metodą) wylosowaliśmy coś większego niż 92 000 000, autor radzi zmienić pierwszą cyfrę lub wygenerować nowy IV. Również doradza, aby unikać używania zera jako pierwszej cyfry tych liczb.

Generowanie kluczy na komputerze

Rzucanie kostką, jakkolwiek czasochłonne, jest jedną z najlepszych opcji generowania kluczy. Jednak autor zapewnia również szybszą opcję w postaci użycia aplikacji z generatorem liczb losowych. W repozytorium na GitHubie znajduje się prosty program, który generuje klucze, używane w tym systemie (rysunek 2). Wynikowe klucze wydają się dostatecznie dobre do tego rodzaju zastosowania, jednak jak zaznacza sam autor – nie przeprowadził on żadnych testów, więc nie można zagwarantować, że wynik jest dostatecznie losowy.

Rysunek 2. Aplikacja do generowania kluczy z losowymi danymi

Problem z losowością w komputerze jest w ogólności taki, że typowo generowane liczby są pseudolosowe, co zmniejsza siłę tego rodzaju zabezpieczenia. Oczywiście, do większości aplikacji tego rodzaju generatory są dostateczne. Samo zagadnienie losowości i tego, jak zbliżyć można się do niej w systemach komputerowych, wykracza jednak poza ramy tego artykułu.

Aby wygenerować klucze, należy uruchomić program gen.exe z folderu Untested RNG pobranego z repozytorium, a następnie kliknąć przycisk Generuj klucze dla projektu Black Swan.

Budowa urządzenia

Nadajnik

Montaż nadajnika nie powinien być trudnym zadaniem. Najtrudniejszym elementem wydaje się podłączenie w odpowiedni sposób interfejsu PS/2 do mikrokontrolera. Na rysunku 3 zaprezentowano schemat ideowy modułu nadajnika, sporządzony we Fritzing, dzięki czemu jest czytelny nie tylko dla elektroników, ale także hobbystów i amatorów.

Rysunek 3. Schemat modułu nadajnika

Połączenia na płytce stykowej najlepiej wykonać jest gotowymi przewodami, zakończonymi goldpinami lub gniazdami goldpin. Przykład realizacji projektu dokładnie w taki sposób pokazano na fotografii 1. Jakkolwiek obudowa jest ważnym elementem urządzenia elektronicznego, tak tutaj nie jest ona krytyczna, dlatego też autor systemu pominął w projekcie ten element.

Fotografia 1. Moduł nadajnika zestawiony na płytce stykowej

Odbiornik

Montaż odbiornika jest jeszcze prostszy. Wystarczy podłączyć wyświetlacz z Nokii 5110 do modułu ESP8266, tak jak pokazano to na rysunku 4.

Rysunek 4. Schemat ideowy modułu odbiornika

Podczas montażu warto zwrócić uwagę na pin BL wyświetlacza. W niektórych egzemplarzach musi być on podciągnięty do zasilania (3,3 V) systemu, aby wyświetlacz się uruchomił. Odbiornik można złożyć na płytce stykowej, jak pokazano na fotografii 2 lub łącząc przewodami płytkę z mikrokontrolerem i moduł wyświetlacza.

Fotografia 2. Moduł odbiornika zestawiony na płytce stykowej

Oprogramowanie

Szkice Arduino dla nadajnika i odbiornika sygnału pobieramy z repozytorium na GitHubie. Przed załadowaniem do układów musimy jednak wprowadzić w nich kilka danych. Poszczególne, opisane poniżej elementy wpisujemy w oznaczonych miejscach szkiców dla obu modułów – odbiornika i nadajnika.

Adres MAC odbiornika

Aby uzyskać adres MAC odbiornika, najprościej jest wgrać do ESP8266 prosty program (listing 1), który zwróci nam przez port szeregowy adres MAC układu. Następnie należy otworzyć monitor portu szeregowego w Arduino i zresetować płytkę. Jeśli program został załadowany poprawnie, mikrokontroler zwróci adres fizyczny karty sieciowej przez interfejs UART do komputera. W przypadku modułu autora adres ten to 5C:CF:7F:FD:85:1D.

Listing 1. Prosty program, który wyśle przez port szeregowy adres MAC układu ESP8266

#include <ESP8266WiFi.h>

void setup(){
   Serial.begin(115200);
   Serial.println();
   Serial.println(WiFi.macAddress());
}

void loop(){
}

Wygenerowane klucze

Otwieramy i edytujemy pliki Firmware_for_the_transmitter.ino i Firmware_for_the_receiver.ino. W pierwszej kolejności musimy zastąpić już znajdujące się tam klucze tymi wartościami, jakie sami wygenerowaliśmy. Należy upewnić się również, że klucze są takie same w obu szkicach. Następnie zmienić musimy adres MAC odbiornika w szkicu dla nadajnika. Wpisujemy go w linii:

// Receiver’s MAC address w pliku: Firmware_for_the_transmitter.ino
uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0xFD, 0x85, 0x1D};

Programowanie urządzeń

Finalnie ładujemy oprogramowanie do obu modułów, pamiętając, aby do nadajnika i odbiornika wgrać odpowiednie szkice, uzupełnione danymi – kluczami i adresem MAC. Urządzenia programujemy za pomocą środowiska Arduino IDE.

Uruchomienie układu

Finalnie, po złożeniu systemu i wgraniu do niego oprogramowania, nadchodzi czas, aby przetestować urządzenie. W pierwszej kolejności należy włączyć odbiornik – to ważne. Odbiornik wymaga konfiguracji klucza i dodania IV przy każdym włączeniu. Został on zaprojektowany w ten sposób, aby zwiększyć bezpieczeństwo i aby żadne dwa bloki nigdy nie były szyfrowane tym samym kluczem (jeśli założy się, że IV jest częścią klucza). Po włączeniu odbiornik czeka na pakiet inicjujący zawierający tzw. numer inicjujący.

Po włączeniu nadajnik wysyła pakiet inicjujący do odbiornika. Odbiornik następnie odszyfrowuje pakiet inicjujący i wyodrębnia z niego wartość numeru inicjującego. Jeżeli wartość odebranego numeru inicjującego jest większa niż wartość numeru inicjującego przechowywanego w pamięci odbiornika, ale nie większa niż wartość numeru inicjującego + 5000, to ten numer jest akceptowany i używany w kluczowych procesach konfiguracji i regulacji IV, w przeciwnym razie odbiornik zgłosi błąd.

Po włączeniu odbiornika powinien pojawić się na jego ekranie napis o oczekiwaniu na przybycie pakietu inicjującego. Teraz można włączyć nadajnik. Poinformuje on o pomyślnej konfiguracji kluczy i IV.

Aby wysłać tekst do odbiornika, należy wpisać go na klawiaturze komputerowej podłączonej do nadajnika i nacisnąć przycisk Enter. Aby wysłać tekst z poziomu portu szeregowego, należy nacisnąć przycisk Tab na klawiaturze podłączonej do nadajnika. Odbiornik drukuje wszystkie odebrane dane do monitora szeregowego.

Podsumowanie

Jak pisze autor, wykonał on wszystko, co w jego mocy, aby Black Swan był jak najbardziej odporny na hakowanie. Wykonanie ataku brute force na to urządzenie jest niewykonalne, ponieważ istnieje 2936 możliwych kombinacji klawiszy (może trochę mniej, jeśli weźmie się pod uwagę, że IV mają tylko cyfry od 0 do 9), a jeśli chodzi o niezbyt barbarzyńskie ataki, takie jak wybrany tekst jawny i ataki typu replay, też nie ma co się nimi martwić, ponieważ algorytm szyfrowania jest odporny na tego typu działania.

System ma jednak pewne ograniczenia. Po pierwsze, odległość między obydwoma ESP może sięgać do około 200 metrów, a odporność algorytmu szyfrowania na hakowanie nie oznacza, że nigdy nie zostanie złamany. Jeśli osoba trzecia wejdzie w posiadanie jednego z urządzeń lub uzyska oprogramowanie układowe jednego z ESP, może być w stanie podsłuchiwać komunikację, a nawet manipulować wysyłanymi danymi. Podczas gdy pierwszy przypadek jest oczywisty, drugi wymaga lepszego wyjaśnienia. Jeśli komputer, którego użyto do modyfikacji oprogramowania układowego i/lub wgrania oprogramowania układowego do ESP jest w jakikolwiek sposób zagrożony, ktoś z drugiej strony ekranu może uzyskać klucze i IV, które wgrane zostały do ESP i później użyć tego przeciwko nam, podsłuchując transmisję.

Urządzenie to, mimo swoich wad, może znaleźć szereg ciekawych i wartościowych zastosowań w zakresie komunikacji na niewielkie odległości. Dodatkowo, wiedza zdobyta przy implementacji tego rodzaju rozwiązań z pewnością przyda się do rozwijania innych aplikacji kryptograficznych, nie tylko na mikrokontrolerach z rodziny ESP.

Nikodem Czechowski, EP

Źródła:

Artykuł ukazał się w
Elektronika Praktyczna
wrzesień 2022

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik czerwiec 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje maj 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna czerwiec 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich czerwiec 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów