RC4

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
RC4
Rodzaj szyfru symetryczny szyfr strumieniowy
Data stworzenia 1987
Autorzy Ron Rivest
Skuteczne ataki atak FMS

RC4 (zwany również ARC4 albo ARCFOUR) jest popularnym szyfrem strumieniowym. Używany jest w protokołach, takich jak SSL oraz WEP. Pomimo, że RC4 jest odporny na kryptoanalizę liniową i kryptoanalizę różnicową to jest obecnie uznawany za niezbyt bezpieczny kryptosystem. RC4 nie jest zalecany do używania w nowych systemach.

Historia[edytuj | edytuj kod]

RC4 został opracowany przez Rona Rivesta z RSA Security w 1987 roku. Oficjalnie nazwa jest akronimem słów "Rivest Cipher 4".

RC4 początkowo był tajemnicą handlową. We wrześniu 1994 implementacja szyfru w języku C została wysłana anonimowo na listę mailową Cypherpunks, skąd trafił na grupę dyskusyjną sci.crypt. Od tej pory algorytm nie jest już tajemnicą handlową, ale nazwa RC4 nadal jest zastrzeżonym znakiem handlowym. Nieoficjalne implementacje szyfru są legalne, ale noszą inną nazwę niż RC4 ("ARC4" lub "ARCFOUR").

Opis szyfru[edytuj | edytuj kod]

RC4 generuje pseudolosowy strumień bitów (strumień szyfrujący). W celu zaszyfrowania wykonywana jest operacja XOR na tekście oryginalnym i strumieniu szyfrującym (jak w każdym szyfrze Vernama). W celu odszyfrowania analogicznie wykonywana jest operacja XOR na tekście zaszyfrowanym i strumieniu szyfrującym.

W celu wygenerowania strumienia szyfrującego wykorzystuje się tajny stan początkowy, składający się z dwóch części:

  1. Permutacji 256-elementowej wszystkich możliwych stanów (oznaczanej później S).
  2. Dwóch 8-bitowych wskaźników (oznaczanych "i" i "j").

Permutacja jest zainicjalizowana za pomocą klucza o długości zazwyczaj pomiędzy 40 i 256 bit (procedura inicjowania klucza). Następnie tworzony jest strumień bitów wyjściowych za pomocą algorytmu pseudolosowej generacji.

Procedura inicjowania klucza[edytuj | edytuj kod]

Procedura inicjalizacji klucza jest używana w celu stworzenia początkowej permutacji liczb w 256-elementowej tablicy "S". Długość klucza jest wyznaczona poprzez liczbę bajtów w kluczu. Typowo wynosi pomiędzy 5 a 16 bajtów (pomiędzy 40 a 128 bitów).

Początkowo w tablicy "S" tworzona jest permutacja identycznościowa. Następnie "S" jest przetwarzane w 256 iteracjach (podobnie jak w algorytmie pseudolosowej generacji) i mieszane jednocześnie z bajtami klucza.

for i from 0 to 255
    S[i] := i
j := 0
for i from 0 to 255
    j := (j + S[i] + klucz[i mod długość_klucza]) mod 256
    zamień(S[i],S[j])

Algorytm pseudolosowej generacji[edytuj | edytuj kod]

Etap pośredni RC4. Bajt strumienia szyfrującego K jest tworzony poprzez znalezienie wartości w S wskazywanej przez S[i] + S[j] (modulo 256).

Algorytm pseudolosowej generacji modyfikuje stan tablicy S i generuje bajt strumienia szyfrującego tyle razy, ile wynosi długość tekstu oryginalnego. Za każdym razem algorytm zwiększa i o 1, dodaje do j wartość w S wskazywaną przez i, zamienia ze sobą wartości S[i] i S[j] oraz jako wynik daje wartość z S wskazywaną przez S[i] + S[j] (modulo 256). Każda wartość S jest zamieniana co najmniej raz na każde 256 iteracji.

i := 0
j := 0
while TworzonyStrumieńSzyfrujący:
    i := (i + 1) mod 256
    j := (j + S[i]) mod 256
    zamień(S[i],S[j])
    wynik S[(S[i] + S[j]) mod 256]

Wektory testowe[edytuj | edytuj kod]

Wektory testowe podane poniżej nie mają statusu oficjalnego, jednak są dogodne dla każdego, kto chce przetestować swoją implementację RC4. Dane wejściowe są w formacie ASCII, dane wyjściowe w formacie heksadecymalnym

RC4( "Key", "Plaintext" ) == BBF316E8D940AF0AD3
RC4( "Wiki", "pedia" ) == 1021BF0420
RC4( "Secret", "Attack at dawn" ) == 45A01F645FC35B383552544B9BF5
RC4( "Kry", "ptologia" ) == 015C5F30796B0B94

Bezpieczeństwo RC4[edytuj | edytuj kod]

Pewne sekwencje bajtów pojawiają się nieznacznie częściej w strumieniu szyfrującym RC4 niż inne. W 2000 roku Fluhrer i McGrew opracowali atak oparty na tej własności. Za pomocą tego ataku można wyodrębnić strumień szyfrujący z gigabajta losowych danych wyjściowych.

Atak Fluhrera, Mantina i Shamira[edytuj | edytuj kod]

W 2001 roku Fluhrer, Mantin i Shamir odkryli, że wśród wszystkich możliwych kluczy RC4 rozkład statystyczny kilku pierwszych bajtów wyjściowego strumienia szyfrującego jest silnie nielosowy. Analizując dużą liczbę wiadomości zaszyfrowanych tym samym kluczem, można uzyskać ten klucz. Odkrycie to pozwoliło na złamanie standardu szyfrowania WEP ("wired equivalent privacy") używanego w bezprzewodowych sieciach typu 802.11. Spowodowało to przyspieszony rozwój standardu szyfrowania WPA, będącego następcą WEP.

Istnieje możliwość obrony przed atakiem tego typu. W tym celu należy odrzucić początkową porcję danych ze strumienia szyfrującego (co najmniej pierwsze 1024 bajty).

Kryptosystemy oparte na RC4[edytuj | edytuj kod]

W kryptosystemach oznaczonych "(opcjonalnie)" RC4 jest jednym z wielu szyfrów, które mogą być użyte.

Zobacz też[edytuj | edytuj kod]