ου γαρ εστιν κρυπτον ο ου φανερον γενησεται ουδε αποκρυφον ο ου γνωσθησεται και εις φανερον ελθη
Wersja PL ENG Version

Tryby działania szyfrów blokowych

Tryby działania szyfrów blokowych są sposobami konfiguracji, które umożliwiają tym szyfrom operowanie na olbrzymich strumieniach danych, bez narażania jakości dostarczanego szyfrowania.

Stosowanie blokowych szyfrów symetrycznych wiąże się z niebezpieczeństwem użycia tych samych bitów sekretnego klucza do zaszyfrowania takich samych fragmentów tekstu jawnego. Wykorzystanie jednego deterministycznego algorytmu szyfrującego do zakodowania pewnej ilości identycznych danych wejściowych, daje w wyniku powtarzające się dane wyjściowe.

Stwarza to niebezpieczeństwo dla użytkowników szyfrów blokowych. Ewentualny napastnik mógłby wyciągnąć dużo informacji znając rozkład powtarzających się takich samych fragmentów wiadomości, nawet jeśli nie zdołałby całkowicie złamać szyfru i poznać całego tekstu jawnego.

Istnieją metody na zaciemnianie szyfrogramu. Polegają one na mieszaniu bloków posiadanego tekstu jawnego z blokami tworzonego właśnie szyfrogramu w taki sposób, aby uniemożliwić powtarzanie się takich samych bloków wyjściowych. Wykorzystuje się w tym celu modyfikacje algorytmów szyfrów blokowych nazywane trybami działania szyfrów blokowych.

Tryb ECB (ang. electronic codebook)

Jest to najprostszy sposób szyfrowania. Każdy z bloków wiadomości jest kodowany oddzielnie. Podobnie, każdy blok szyfrogramu jest również deszyfrowany oddzielnie.

Umożliwia to przeprowadzanie zarówno szyfrowania jak i deszyfrowania przy pomocy wielu wątków równocześnie. W trybie tym nie następuje zaciemnianie otrzymywanego szyfrogramu.

szyfrowanie w trybie ECB
Szyfrowanie w trybie ECB
deszyfrowanie w trybie ECB
Deszyfrowanie w trybie ECB

Typowym przykładem słabości szyfrowania w trybie ECB jest zakodowanie obrazka zapisanego jako mapa bitowa (np. z rozszerzeniem .bmp) za pomocą silnego algorytmu działającego w takim właśnie trybie.

Oryginalny obraz
Obraz zaszyfrowany za pomocą DES ECB  Obraz zaszyfrowany za pomocą DES CBC
Prosta mapa bitowa zaszyfrowana za pomocą DES przy użyciu takiego samego sekretnego klucza. Po lewej użyto trybu ECB, natomiast po prawej trybu CBC.

Wiadomości szyfrowane za pomocą trybu ECB muszą być wyrównane do długości równej wielokrotności długości pojedynczego bloku. Popularną metodą wyrównywania długości ostatniego bloku jest dopisanie za ostatnim bitem wiadomości dodatkowego bitu równego 1, a następnie dopełnienie wiadomości bitami zerowymi aż do długości równej wielokrotności długości jednego bloku. Pozwala to precyzyjnie określić, gdzie kończy się oryginalna wiadomość. Istnieje więcej sposobów dopełniania długości wiadomości.

Szyfry kodowane za pomocą trybu ECB są bardziej podatne na ataki metodą powtórzenia.

Tryb CBC (ang. cipher-block chaining)

Tryb CBC używania szyfrów blokowych został opracowany w IBM w roku 1976. Polega on na dodawaniu XOR każdego kolejnego bloku tekstu jawnego do poprzednio otrzymanego bloku szyfrogramu. Dopiero wynik tego działania jest szyfrowany w zwykły sposób. Każdy kolejny blok szyfrogramu zależy więc od poprzedniego bloku szyfrogramu. Pierwszy blok tekstu jawnego jest dodawany XOR do losowego wektora inicjującego (zwyczajowo oznaczanego jako IV), o takiej samej długości jak długość każdego bloku danych.

Szyfrowanie w trybie CBC może być przeprowadzane tylko z wykorzystaniem jednego wątku. Mimo tej niedogodności, jest to bardzo popularny tryb wykorzystywania szyfrów blokowych.

W trakcie operacji odszyfrowywania, należy sumować XOR kolejne dane otrzymywane jako wynik działania algorytmu deszyfrującego z poprzednio otrzymanymi blokami szyfrogramu. Z racji tego, że odbiorca dysponuje wszystkimi blokami szyfrogramu już w momencie otrzymania zakodowanej wiadomości, proces deszyfrowania może odbywać się z wykorzystaniem wielu wątków równocześnie.

szyfrowanie w trybie CBC
Szyfrowanie w trybie CBC
deszyfrowanie w trybie CBC
Deszyfrowanie w trybie CBC

Zakłamanie jednego bitu tekstu jawnego (na przykład w wyniku błędu w transmisji) powoduje całkowite uszkodzenie wszystkich kolejnych bloków szyfrogramu i czyni niemożliwym odszyfrowanie go w przyszłości. W przeciwieństwie do tego, zakłamanie jednego bitu szyfrogramu, powoduje uszkodzenie jedynie dwóch odszyfrowanych bloków tekstu jawnego.

Wiadomość, która ma być zaszyfrowana za pomocą trybu CBC musi być wyrównana do długości równej wielokrotności długości jednego bloku, podobnie jak ma to miejsce podczas używania trybu ECB.

Bezpieczeństwo w trybie CBC

Wektor inicjujący IV powinien zostać wybrany w sposób losowy przez nadawcę. Następnie trzeba go dołączyć do przesyłanego szyfrogramu, aby umożliwić odbiorcy odkodowanie wiadomości. Jeśli napastnik może przewidzieć jaki wektor zostanie użyty, wtedy szyfrowanie nie jest odporne na ataki z wybranym tekstem jawnym:

Schemat ataku CPA na CBC

W zaprezentowanym powyżej przykładzie, jeżeli napastnik jest w stanie przewidzieć użycie wektora IV1, to będzie mógł określić czy odpowiedź systemu (c1) jest zakodowaną wiadomością m0, czy też zakodowaną wiadomością m1. Łamie to zasadę nierozróżnialności szyfrogramów, nawet w przypadku wybrania tekstów jawnych przez napastnika, czyli system okazuje się nieodporny na ataki wybranym tekstem jawnym.

Jeżeli IV generowany jest na podstawie nielosowych danych, na przykład wprowadzonego przez użytkownika hasła, to powinien zostać najpierw zaszyfrowany przed użyciem przy użyciu osobnego sekretnego klucza.

Można wykazać, że nawet przy prawidłowym doborze IV, użycie tego samego sekretnego klucza zbyt dużą ilość razy, umożliwia łamanie szyfrowania za pomocą ataków z wybranym tekstem jawnym. Dla AES przyjmuje się, że jest to około 248 bloków, natomiast dla szyfru 3DES około 216 bloków tekstu jawnego.

Tryb PCBC (ang. propagating lub plaintext cipher-block chaining)

PCBC jest odmianą trybu CBC. Podobnie jak CBC, podczas szyfrowania zapewnia wymieszanie bitów z różnych bloków wiadomości. Charakteryzuje się tym, że -w przeciwieństwie do CBC- zakłamanie nawet jednego bitu w otrzymanym szyfrogramie, powoduje uszkodzenie odpowiadającego mu bloku tekstu jawnego oraz wszystkich kolejnych bloków.

W trybie PCBC zarówno szyfrowanie jak i deszyfrowanie musi być wykonywane przy użyciu pojedynczego wątku.

szyfrowanie w trybie PCBC
Szyfrowanie w trybie PCBC
deszyfrowanie w trybie PCBC
Deszyfrowanie w trybie PCBC

Tryb CFB (ang. cipher feedback)

Algorytmy działające w trybie CFB charakteryzują się podobną strukturą do wcześniej opisanego CBC. Główną różnicą jest to, że szyfruje się nie tyle bloki tekstu jawnego, lecz wymieszane dane z poprzedniej rundy, do których następnie dodaje się oryginalne bity wiadomości. Nie ma to negatywnego wpływu na siłę zabezpieczeń. W wyniku takiego powiązania operacji, podczas deszyfrowania bloków szyfrogramu wykorzystuje się algorytmy szyfrujące, dokładnie te same, które zostały wcześniej użyte podczas szyfrowania.

szyfrowanie w trybie CFB
Szyfrowanie w trybie CFB
deszyfrowanie w trybie CFB
Deszyfrowanie w trybie CFB

Zakłamanie jednego bitu tekstu jawnego powoduje uszkodzenie aktualnego bloku szyfrogramu i wszystkich kolejnych bloków. Szyfrowanie wiadomości może być przeprowadzone z wykorzystaniem tylko jednego wątku.

Z drugiej strony, podobnie jak w CBC, deszyfrowanie może być wykonane za pomocą wielu wątków równocześnie. Również tak samo jak w trybie CBC, zakłamanie jednego bitu szyfrogramu uszkadza dwa bloki odkodowywanego tekstu jawnego.

W przeciwieństwie do poprzednich trybów stosowania szyfrów blokowych, szyfrowana wiadomość nie musi zostać rozbudowana do długości równej całkowitej wielokrotności długości jednego bloku.

Tryb OFB (ang. output feedback)

Algorytmy szyfrujące działające w trybie OFB wytwarzają strumień bitów klucza, który potem wykorzystywany jest do kodowania kolejnych bloków danych. Pod tym względem, działanie szyfru blokowego upodabnia się do pracy typowego szyfru strumieniowego.

szyfrowanie w trybie OFB
Szyfrowanie w trybie OFB
deszyfrowanie w trybie OFB
Deszyfrowanie w trybie OFB

Z racji ciągłego tworzenia strumienia bitów klucza, zarówno szyfrowanie jak i deszyfrowanie odbywać się może tylko w jednym wątku równocześnie. Podobnie jak w trybie CFB, zarówno do szyfrowania jak i deszyfrowania wykorzystuje się te same algorytmy szyfrujące.

Uszkodzenie jednego bitu tekstu jawnego bądź szyfrogramu powoduje zakłamanie jednego, odpowiadającego mu, bitu odpowiednio szyfrogramu lub tekstu jawnego. Umożliwia to zastosowanie różnych mechanizmów korekcji danych, przeciwdziałających błędom transmisji.

Największą wadą OFB jest to, że wielokrotne szyfrowanie wektora inicjującego może zwrócić powtórnie takie same bajty, jakie wystąpiły już wcześniej. Jest to mało prawdopodobne, ale w takim przypadku tekst jawny zacznie być szyfrowany przy użyciu takich samych danych co poprzednio.

Tryb CTR (ang. counter)

Użycie trybu CTR upodabnia działanie szyfru blokowego do szyfrów strumieniowych. Podobnie jak w przypadku trybu OFB, bity strumienia klucza tworzone są niezależnie od zawartości kolejno szyfrowanych bloków danych. W tym trybie szyfruje się kolejne wartości stale zwiększającego się licznika, zsumowane z dodatkową liczbą nazywaną nonce (nonce oznacza unikalny numer: number used once). Nonce pełni taką samą rolę jak wektor inicjujący w poprzednich trybach.

szyfrowanie w trybie CTR
Szyfrowanie w trybie CTR
deszyfrowanie w trybie CTR
Deszyfrowanie w trybie CTR

Jest to jeden z najpopularniejszych trybów działania szyfrów blokowych. Zarówno szyfrowanie jak i deszyfrowanie może odbywać się z wykorzystaniem wielu wątków równocześnie.

Uszkodzenie jednego bitu tekstu jawnego lub szyfrogramu powoduje uszkodzenie odpowiadającego mu jednego zakodowanego lub odkodowanego bitu. Podobnie jak w przypadku użycia trybu OFB, pozwala to na zastosowanie różnych mechanizmów przeciwdziałania błędom transmisji.

Tryb CTR jest również znany jako tryb SIC (ang. Segment Integer Counter).

Bezpieczeństwo w trybie CTR

Podobnie, jak w przypadku opisanego wyżej trybu CBC, również w trybie CTR należy zmienić klucz szyfrujący po pewnej liczbie wysłanych wiadomości. Można wykazać, że CTR zapewnia większe bezpieczeństwo transmisji i klucz musi być zmieniany rzadziej.

Dla szyfru AES ilość bloków tekstu jawnego, po której należy zmienić wykorzystywany sekretny klucz, można w przybliżeniu określić na 264.