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:
- 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).
- Blok jest dzielony na osiem równych części.
- Każda część bloku przechodzi przez Rijndael S-box „w przód”.
- Osiem wyjść z S-boxów jest sklejanych ze sobą (konkatenowanych) i wykonywana jest operacja XOR pomiędzy wynikiem konkatenacji a pierwszym IV.
- 64-bitowa wartość pobrana z poprzedniego kroku jest szyfrowana za pomocą algorytmu 3DES.
- 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.
- Osiem wyjść z S-boxów z poprzedniego kroku ponownie podlega konkatenacji i działaniu XOR, tym razem z drugim IV.
- 64 losowe bity są łączone z 64 bitami z poprzedniego kroku.
- Otrzymana 128-bitowa wartość jest szyfrowana za pomocą algorytmu AES-256.
- Wartość wygenerowana przez algorytm AES-256 jest dzielona na dwie równe, 64-bitowe części.
- 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.
- 64 losowe bity są łączone z każdą połową XOR z IV, tworząc w ten sposób dwie 128-bitowe wartości.
- Każda 128-bitowa wartość jest szyfrowana algorytmem Serpent.
- Wartości generowane przez algorytm Serpent są jednocześnie wysyłane do odbiorcy.
- 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.