Przejdź do zawartości

Wektor inicjujący

Z Wikipedii, wolnej encyklopedii

Wektor inicjujący (ang. initialization vector, IV) – ciąg bitów o stałej długości wykorzystywany jako dodatkowe dane wejściowe do algorytmów kryptograficznych. Zazwyczaj wymagana jest od niego wysokiej jakości losowość, która ma istotne znaczenie przy bezpieczeństwie semantycznym, ponieważ atakujący może zbadać relacje zachodzące między segmentami szyfrowanych danych poprzez ich ciągłe szyfrowanie za pomocą tego samego klucza. Wektor inicjujący znajduje zastosowanie w większości trybów działania szyfrów blokowych. Losowość jest również wymagana dla innych zastosowań, takich jak uniwersalne funkcje skrótu czy kody uwierzytelniania wiadomości.

W niektórych zastosowaniach wystarczy jego niepowtarzalność, a wymagana losowość jest osiągnięta przez inne mechanizmy. W takich przypadkach, IV nazywamy wartością jednorazową, przy czym algorytm ma postać statyczną, a nie losową, ponieważ IV nie musi być przekazany do odbiorcy, lecz może wynikać ze wspólnego stanu zaktualizowanego zarówno po stronie nadawcy, jak i odbiorcy. W praktyce, krótka wartość jednorazowa jest przekazywana wraz z wiadomością, by móc określić fakt jej utraty. Przykładem statycznego schematu szyfrowania jest tryb licznikowy, który używa numeru bloku jako wartości jednorazowej.

Długość IV jest zależna od zastosowania; dla szyfrów blokowych jest zazwyczaj równa długości bloku. W schematach szyfrowania, nieprzewidywalna część powinna mieć taką samą długość co klucz, by skutecznie przeciwdziałać atakom[1][2][3][4]. Przy losowym IV, zgodnie z paradoksem dnia urodzin, prawdopodobieństwo kolizji jest dość wysokie. Tradycyjne szyfry strumieniowe, takie jak RC4, nie używają IV. Można rozbudować te algorytmy tak, by wcielić go w klucz szyfru lub stan wewnętrzny. Niektóre rozwiązania zrealizowane w praktyce są powszechnie uznane za niebezpieczne, np. protokół WEP jest podatny na ataki związane z wektorem inicjującym.

Zasadność stosowania

[edytuj | edytuj kod]
Niskiej jakości szyfrogram jako skutek użycia trybu ECB

Szyfrowanie blokowe jest jednym z najbardziej podstawowych pojęć w kryptografii. Często jest używane do szyfrowania danych, jednak samo w sobie może być zastosowane tylko do zakodowania bloku danych o ściśle określonym rozmiarze. Przykładowo, pojedyncze wywołanie algorytmu AES przekształca 128-bitowy blok tekstu jawnego w szyfrogram o tym samym rozmiarze. Klucz, który stanowi jedno z wejść do algorytmu, definiuje odwzorowanie między tekstem jawnym a szyfrogramem. Prostą strategią jest rozbicie danych w bloki o równej długości i zaszyfrowanie każdego bloku oddzielnie używając tego samego klucza. Ta metoda jest niebezpieczna, ponieważ takie same bloki tekstu jawnego są przekształcane w takie same szyfrogramy, przez co możliwe jest częściowe poznanie treści szyfrogramu bez jego odkodowywania.

Do ukrycia elementów charakterystycznych w zaszyfrowanych danych nie jest konieczne wydawanie oddzielnych kluczy dla każdego bloku. W 1980 roku, NIST opublikowało normę FIPS PUB 81, która określała cztery tzw. tryby działania szyfrów blokowych, gdzie każdy opisywał różne rozwiązanie dla szyfrowania zbioru bloków wejściowych. Pierwszy z nich to opisany powyżej prosty schemat elektronicznej książki kodowej(ECB). Dla kontrastu, każdy z pozostałych trybów opisuje proces, w którym kryptogram z jednego bloku jest wmieszany w dane następnego bloku. Do zainicjowania tego procesu niezbędna jest dodatkowa informacja wejściowa, która zostanie wmieszana w pierwszy blok. Informacja ta nosi nazwę wektora inicjującego.

Przykładowo, tryb CBC wymaga dowolnej wartości o długości bloku jako dodatkowego wejścia i dodaje go do pierwszego bloku tekstu jawnego tuż przed szyfrowaniem, następnie otrzymany szyfrogram jest sumowany z drugim blokiem tekstu jawnego itd. Ostatecznym celem tych schematów jest zapewnienie bezpieczeństwa semantycznego; dzięki temu, kryptogram posiada własność białego szumu, więc atakujący nie może niczego wywnioskować na podstawie kryptogramu. Można udowodnić, że każdy z trzech dodatkowych trybów określonych przez NIST jest odporny na tzw. atak z wybranym tekstem jawnym.

Cechy charakterystyczne

[edytuj | edytuj kod]

Właściwości IV zależą od używanego schematu kryptograficznego. Podstawowym wymaganiem jest unikalność, która oznacza, że żaden IV nie może być ponownie użyty pod tym samym kluczem. Dla szyfrów blokowych, powtarzanie tej samej wartości IV wiąże się z przejściem schematu szyfrowania w tryb ECB: ten sam IV przy tym samym tekście jawnym implikuje ten sam kryptogram. W przypadku szyfrów strumieniowych, własność unikalności jest szczególnie istotna, ponieważ w przeciwnym wypadku tekst jawny może zostać odtworzony bez większego wysiłku ze strony atakującego.

Przykład: Szyfry strumieniowe szyfrują tekst jawny P do kryptogramu C poprzez wyprowadzenie strumienia klucza K z danego klucza oraz wektora inicjującego. C = P xor K. Przyjmijmy, że atakujący podejrzał dwie wiadomości C1 i C2 zaszyfrowane tym samym kluczem i wektorem inicjującym. Wiedza o P1 albo P2 jest wystarczająca do poznania wartości drugiego tekstu jawnego, ponieważ
C1 xor C2 = (P1 xor K) xor (P2 xor K) = P1 xor P2.

Wiele schematów wymaga od wektora inicjującego by był nieprzewidywalny z punktu widzenia złośliwego użytkownika. Własność tę można osiągnąć poprzez losowy lub pseudolosowy dobór jego wartości. Szansa na wystąpienie kolizji jest funkcją zaniedbywalną, aczkolwiek powinno być rozważone wystąpienie paradoksu urodzinowego. Przewidywalny IV może pozwolić na odtworzenie (części) tekstu jawnego.

Przykład: Rozważmy scenariusz, w którym Alicja szyfruje wiadomości używając trybu CBC, podczas gdy złośliwa Ewa może podglądać szyfrogramy oraz przekazywać własne dane do Alicji w celu zaszyfrowania, czyli Ewa ma możliwość dokonania ataku z wybranym tekstem jawnym. Alicja wysyła wiadomość zawierającą wektor inicjujący IV1 i początek szyfrogramu CAlice. Niech PAlice oznacza pierwszy blok tekstu jawnego Alicji,E szyfrowanie i PEve będzie domysłem Ewy na pierwszy blok tekstu jawnego. Jeżeli Ewa może teraz określić wektor inicjujący IV2 następnej wiadomości, to będzie ona mogła sprawdzić poprawność swojego domysłu przez przekazanie Alicji wiadomości zaczynającej się na (IV2 xor IV1 xor PEve); jeśli ów domysł okazał się poprawny, ten blok zostanie zaszyfrowany przez Alicję do CAlice. Wynika to z prostej zależności:
CAlice = E(IV1 xor PAlice) = E(IV2 xor (IV2 xor IV1 xor PAlice))[5].

Podczas gdy schematy z losowaniem zawsze wymagają, by wybrany przez nadawcę IV został przekierowany do odbiorców, statyczne schematy pozwalają nadawcy i odbiorcy dzielić wspólny stan, który jest aktualizowany w odgórnie zdefiniowany sposób po obydwu stronach.

Szyfry blokowe

[edytuj | edytuj kod]

Szyfr blokowy przetwarzający dane działa w jednym z trybów. Tryby te znajdują zastosowania zarówno dla szyfrowania, jak i uwierzytelniania, przy czym obecnie istnieją tryby, które łączą te zastosowania. Szyfrowanie związane z utajnianiem danych zazwyczaj pobiera IV o długości bloku, natomiast tryby czysto uwierzytelniające są powszechnie zaimplementowane jako algorytmy deterministyczne, więc wektor inicjujący jest ustawiony na zero lub inną stałą wartość.

Szyfry strumieniowe

[edytuj | edytuj kod]

W szyfrach strumieniowych, IV jest załadowany poprzez klucz do tajnego wewnętrznego stanu szyfru, po czym wykonywane są cykle szyfrowania i wydawany jest pierwszy bit szyfrogramu. Ze względu na wydajność, projektanci szyfrów strumieniowych starają się utrzymywać minimalną liczbę cykli. Jest to złożony proces, wymagający wzięcia pod uwagę innych kwestii takich jak utrata entropii czy ataki zorientowane na wektor inicjujący. Z tych powodów zastosowanie IV w szyfrach strumieniowych budzi wiele kontrowersji i jest przedmiotem przyszłych badań.

WEP IV

[edytuj | edytuj kod]

Zastosowanie krótkiego, 24-bitowego wektora wiązało się ze złamaniem zasady unikalności, co doprowadziło do złamania szyfru przez wstrzyknięcie pakietu. Pozwoliło to na łamanie algorytmu WEP w ciągu kilku sekund. W związku z tym został on uznany za przestarzały[6].

Zobacz też

[edytuj | edytuj kod]

Przypisy

[edytuj | edytuj kod]
  1. Alex Biryukov. Some Thoughts on Time-Memory-Data Tradeoffs. „IACR Eprint archive”, 2005. 
  2. Jin Hong, Palash Sarkar. Rediscovery of Time Memory Tradeoffs. „IACR Eprint archive”, 2005. 
  3. Alex Biryukov, Sourav Mukhopadhyay, Palash Sarkar, Improved Time-Memory Trade-Offs with Multiple Data, „Lecture Notes in Computer Science”, 3897, Springer, 2007, s. 110–127, DOI10.1007/11693383_8, ISBN 978-3-540-33108-7.
  4. Christophe De Cannière, Joseph Lano, Bart Preneel. Comments on the Rediscovery of Time/Memory/Data Trade-off Algorithm. „ECRYPT Stream Cipher Project”. 40, 2005. 
  5. CWE-329: Not Using a Random IV with CBC Mode http://cwe.mitre.org/data/definitions/329.html.
  6. Nikita Borisov, Ian Goldberg, David A. Wagner, Intercepting Mobile Communications: The Insecurity of 802.11 [online] [dostęp 2006-09-12].