Wstęp
Kryptografia – co to takiego? Jest to bardzo obszerny temat, w którym zawiera się nie tylko szyfrowanie, ale i hashing oraz uwierzytelnienie. W tym artykule liźniesz co nieco z tego tematu.
To, co najbardziej znane w kryptografii – szyfrowanie
Tym, co jest z kryptografii najszerzej znane, to szyfrowanie. Szyfrowanie zapewnia poufność danych przez przekonwertowanie zwykłego tekstu (plain text) na szyfrowany (cipher text). Plain text to rodzaj tekstu, który jest możliwy do odczytu – np. taki, który piszę tutaj. Cipher text jest zaszyfrowany i już nie tak przystępny jak ten, który właśnie czytasz. By zaszyfrować jakiś tekst, musisz go puścić przez algorytm szyfrujący.
Ciphers Transposition
Transpositional Cipher przesuwa tekst o odpowiednią liczbę znaków, na przykład ze słowa „Rafal” przy przesunięciu o jeden powstanie „lRafa”.
Ciphers Substitution
W tym rodzaju szyfrowania znowuż zamieniamy jeden znak na całkiem inny. Można na przykład przekonwertować słowo w ten sposób, że każda litera będzie co piąta w alfabecie, czyli A zamienimy na F i tak dalej. Klasycznymi cipherami (metodami do zmiany tekstu w celu ukrycia jego znaczenia), które korzystają z takiej podmianki, są ROT13 oraz Ceasar.
Uwierzytelnienie
Uwierzytelnianie to w kryptografii metoda służąca do tego, by potwierdzić, czy twórca lub osoba wysyłająca wiadomość jest naprawdę tym, kim mówi, że jest. Poprzez uwierzytelnienie możesz potwierdzić tzw. nonrepudiation.
Nie wydaje mi się, żebym poruszył nonrepudiation do tej pory: jest to niezaprzeczalność, czyli po prostu nie możesz się wyprzeć tematu i powiedzieć „to nie ja robiłem, to on”. Niejednokrotnie przekonałem się, że niezaprzeczalność jest potrzebna, ludzie nie lubią się przyznawać do błędów i otwarcie ponosić ich konsekwencje.
Wiele osób jest wychowanych przez szkołę czy rodziców w ten sposób, że muszą robić wszystko idealnie za pierwszym razem. A w życiu rzadko tak się zdarza: popełniamy masę błędów i należy się do nich przyznać i wyciągnąć wnioski. A nie ukrywać czy zwalać winę na kogoś innego, byle uniknąć ośmieszenia czy kary.
Mam nadzieję, że nie jesteś taką lebiegą, która ucieka od odpowiedzialności za błędy. A jeśli jesteś – to dobra okazja, by się zmienić. Jestem takiego samego zdania jak Al Pacino na poniższym zdjęciu:
Algorytm szyfrowania i klucz
- Algorytm szyfrowania to matematyczna operacja wykonana na danych, która ma za zadanie zmienić dane z czystego tekstu na tekst szyfrowany.
- Klucz jest to zmienny kawałek informacji wykorzystywany przez algorytm szyfrujący do zaszyfrowania bądź odszyfrowania danych.
Caesar Cipher
Caesar to taki algorytm, który podnosi wartość każdego znaku wiadomości o wykorzystany klucz. Celem klucza jest zapewnienie, że nawet jeśli ktoś odkryje, jak działa algorytm, to i tak nie będzie mógł odtworzyć wiadomości, ponieważ nie będzie posiadał odpowiedniego klucza.
Dla przykładu Andrzej pisze szyfrowaną wiadomość do Ciebie i ustawia wartość klucza na 5. W tym momencie każdy znak w wiadomości jest przesunięty o 5. Teraz Andrzej daje Ci właśnie tę informację, że klucz ma wartość 5, byś mógł odszyfrować sobie tę wiadomość.
Jak sam widzisz, w dzisiejszych czasach nie można mówić o tym algorytmie w kontekście jakiegokolwiek bezpieczeństwa. Domyślasz się pewnie, jak łatwo złamać taki szyfr. Ale nadaje się on idealnie do przykładu, aby wyjaśnić Ci różnicę między kluczem a algorytmem.
Powielanie klucza
W kluczu zamiast cyferek korzystamy często ze zdań bądź wyrazów. Poniższy przykład klucza to „abc” (dla ułatwienia obliczeń), a wiadomość to „kryptografia”.
W pierwszej kolejności wiadomość zmieniana jest na numery względem alfabetu jak poniżej:
- Czyli dla naszej wiadomości („kryptografia”) będzie to: 11 18 25 16 20 15 7 18 1 6 9 1
- To samo jest robione dla naszego klucza, czyli abc: 1 2 3 1 2 3 1 2 3 1 2 3
- Następnym krokiem jest dodanie jednych wartości do drugich, czyli: 12 20 2 17 22 18 8 20 4 7 11 4
- Na zakończenie znowu podmieniamy cyferki na literki: LTBQVRHTDGKD
Poniżej masz pokazane, jak to wygląda:
- Wiadomość: Kryptografia = 11 18 25 16 20 15 7 18 1 6 9 1
- Klucz: abcabcabcabc = 1 2 3 1 2 3 1 2 3 1 2 3
- Po dodaniu: 12 20 2 17 22 18 8 20 4 7 11 4
- Zaszyfrowane: LTBQVRHTDGKD
Na końcu z wiadomości „kryptografia” po zaszyfrowaniu powstaje nam „LTBQVRHTDGKD„.
Vigenere Cipher
Dawno dawno temu, za górami, za lasami wykorzystywany również był algorytm Vigenere’a. W wypadku tego algorytmu tworzona była specjalna tabela (poniżej), by określić, który znak wybrać z tabeli za pomocą klucza. Dla prostego przykładu klucz to „jak„, a wiadomość – „Pushsec„. Szukamy teraz w rzędzie P dla kolumny J – przykład na czerwono w tabeli.
- Wiadomość: Pushsec
- Klucz: jakjakj
- Zaszyfrowane: YUCQSOL
- Tabela:
Musisz wiedzieć, że im krótszy klucz, tym łatwiej jest złamać szyfr, tak więc nigdy nie korzystaj z tak krótkich kluczy, jak pokazałem powyżej. W moim przykładzie krótki klucz służył temu, by łatwiej Ci było sobie zobrazować, jak to działa, a także, by mnie było łatwiej to ręcznie przekształcić.
Siła Klucza
Siła klucza, inaczej też key space, odnosi się do tego, jak mocny został użyty klucz do szyfrowania. Zdziwiony ;)? I, jak wiadomo, im wyższy key space, tym lepsze szyfrowanie, ponieważ trzeba wykonać więcej obliczeń, by złamać dane szyfrowanie.
Dla przykładu: klucz 2-bitowy ma możliwe tylko cztery wartości, czyli 00, 01, 10, 11 (zmieniamy zapis liczb z systemu dziesiętnego na binarny). Jak użyjemy klucza 3-bitowego, to mamy już osiem możliwych wartości, czyli 000, 001, 010, 011, 100, 101, 110, 111. Ogólnie wykorzystywane długości to 64-bit,128-bit, 256-bit, 512-bit, 1024-bit, 2048-bit lub 4096-bit. I tak ja mówiłem wcześniej, dążymy do jak największej wartości, lecz musimy pamiętać, że im dłuższy klucz, tym dłuższe będzie rozszyfrowanie.
Szyfr z kluczem jednorazowym, czyli OTP
OTP, czyli one–time pad jest bardzo bezpieczną metodą szyfrowania, ponieważ wykorzystuje klucz tylko raz. Jest on generowany losowo i użyty tylko raz, by nigdy więcej już z niego nie skorzystać. Plusem tego rozwiązania jest to, że gdy napastnik rozszyfruje klucz za pomocą reverse engineering, otrzyma tylko część danych, ponieważ kolejny pakiet zostanie zabezpieczony już innym kluczem i będzie musiał wykonać z sukcesem to samo zadanie na kolejnej paczce danych, by uzyskać do niej dostęp.
Szyfry strumieniowe a szyfry blokowe
W wypadku algorytmu szyfrując strumieniowo dane są szyfrowane po jednym bicie po kolei. Bity tekstowe zamieniane są na bity szyfrowane. Jest to szybsze rozwiązanie niż w wypadku blokowego, które zaraz opiszę, ale nie jest tak jak ono bezpieczne. Dodatkowo w wypadku algorytmu strumieniowego wielkości obu tekstów są takie same, co powoduje mniej błędów.
Gdy jednak błąd wystąpi, jest on tylko na tych bitach, na których wystąpił, a nie na całym tekście. W szyfr blokowy zaś, gdy wystąpi błąd, to cały blok tekstu odpada z gry. Szyfrowanie występuje za pomocą XOR (odmiana szyfru Vigener’a).
Tak jak wspominałem powyżej, w wypadku szyfru blokowego szyfrowane są bloki, a nie bit po bicie. Generalnie szyfr blokowy jest wolniejszy, ale bezpieczniejszy niż Strumieniowy. Szyfr blokowy może być uruchamiany w trybach takich jak ECB (Electronic Cook Book), CBC (Cipher Block Chaining), OFB (Output FeedBack). Opis tych trybów poniżej.
Tryby Block Cipher
- ECB (Electronic Cook Book): Każdy blok jest szyfrowany osobno tym samym kluczem. Jeśli w tekście do zaszyfrowania pojawia się takie samo słowo, jest ono w ten sam sposób zaszyfrowane i łatwo odgadnąć powtarzające się słowa bądź ciągi tekstu.
- CBC (Cipher Block Chaining): W tym wypadku, by nie powtarzały się ciągi, wykorzystywany jest initialization vector (o tym w kolejnym artykule). Pierwszy blok, przed zaszyfrowaniem, jest sumowany modulo dwa z losowo wygenerowanym wektorem początkowym IV. Następnie każdy blok sumowany jest modulo do poprzedniego, w związku z czym wynik szyfrowania jest zależny od poprzednich bloków.
- CBF (Cipher FeedBack): Tu blok jest szyfrowany poprzednim zaszyfrowanym blokiem, co znaczy, że pierwszy szyfrowany blok jest kluczem dla drugiego i tak dalej.
- OFB (Output FeedBack): Każdy blok tekstu jawnego jest XOR–owany, a bieżący blok wyjściowy jest blokiem tekstu zaszyfrowanego. Bieżący blok wyjściowy jest zaszyfrowaną wersją poprzedniego bloku wyjściowego.
- CMT (Counter Mode): Znany również pod nazwą CTR. Działa podobnie do CBF, ale zamiast korzystać z poprzedniego bloku, wartość dzielona jest znana zarówno wysyłającemu, jak i nadawcy by wraz z kluczem mógł odszyfrować wiadomość.
- GCM (Galois/Counter Mode): GCM jest zdefiniowany dla szyfrów blokowych o rozmiarze bloku 128 bitów. GCM może w pełni wykorzystać przetwarzanie równoległe. Może być wykorzystany do potwierdzenia integralności i poufności. Jest zbudowany na CTM, łączy szyfrowany tekst z kodem uwierzytelniającym, by potwierdzić integralność bloku.
Padding
Często tekst jest niewystarczający i trzeba go uzupełnić zerami czy jedynkami, czy kombinacją tych dwóch, by zapełnić blok. Tym właśnie jest Padding.
Podsumowanie
Dziś przeszliśmy przez bardzo skomplikowany temat, a moim zdaniem to nawet nie zadrapaliśmy jego powierzchni. Nie należę do asów kryptografii i nigdy nie będzie to moja specjalizacja, ale z racji, że zajmuję się bezpieczeństwem, muszę znać takie podstawy, jak wyżej wymienione. Nie poruszyłem tematu XOR, o którym wspomniałem wcześniej, bo po prostu już tutaj brakło na niego miejsca, ale w kolejnym artykule od niego zaczniemy i będziemy dalej zagłębiać się w te skomplikowane tematy.
Pozdrawiam – Pusz ????