RC2
- Ogólny opis
- Algorytm
- Schematy blokowe
- Funkcje matematyczne
- Implementacja
Inną nazwą RC2 jest ARC2. Przyjmuje się, że litery RC pochodzą od słów "Rivest Cipher" lub "Ron's Code" (ang. kod Rona).
RC2 jest szyfrem blokowym. Wielkość bloku wynosi 8 bajtów (64 bity). Oznacza to, że dane wejściowe są najpierw dzielone na ośmiobajtowe bloki, z których każdy jest potem przetwarzany oddzielnie.
Każdy blok danych składa się z czterech 16-bitowych słów (czyli każde słowo składa się z dwóch bajtów). Tablica czterech słów jest przedstawiana następująco: R[0] R[1] R[2] R[3]. Zarówno proces szyfrowania jak i deszyfrowania otrzymują jako dane wejściowe taką tablicę czterech słów, którą następnie modyfikują. Wynik działania tych operacji zapisywany jest w tej samej tablicy.
Rozszerzanie Klucza
Oprócz danych do przetworzenia, szyfr RC2 otrzymuje również sekretny klucz szyfrujący, dostarczony przez użytkownika. Klucz może mieć różną wielkość, od jednego do 128 bajtów. Długość sekretnego klucza (w bajtach) można przedstawić jako Keysize. Pierwszą operacją, którą przeprowadza szyfr RC2 jest rozszerzenie otrzymanego klucza, w celu otrzymania nowych 128 bajtów rozszerzonego klucza szyfrującego. Otrzymanych w ten sposób 128 bajtów klucza będzie wykorzystywane do szyfrowania lub deszyfrowania wszystkich bloków danych.
Użytkownik RC2 definiuje również drugą liczbę, oznaczoną jako Keybit-limit, która określa maksymalną rzeczywistą wielkość klucza szyfrującego (w bitach). Znaczy to, że bez względu na to ile bajtów sekretnego klucza dostarczył użytkownik, szyfr RC2 będzie wykorzystywał klucz, którego rzeczywista wielkość wynosi Keybyte-limit, gdzie:
Keybyte-limit = (Keybit-limit + 7) / 8
Oczywiście, rzeczywista siła klucza będzie nawet jeszcze mniejsza, jeśli użytkownik dostarczył mniej bajtów klucza niż Keybyte-limit.
W celu zagwarantowania, że tylko ograniczona liczba bajtów klucza będzie wykorzystana do zabezpieczenia danych, należy zdefiniować następującą maskę bitową:
Keymask = 255 mod 2^(8 + Keybit-limit - 8·Keybyte-limit)
Ustawionych na 1 jest 8 - (8·Keybyte-limit - Keybit-limit) najmniej znaczących bitów maski Keymask, pozostałe pozycje są wyzerowane.
Słowa i Bajty w Kluczu
Operacje matematyczne przeprowadzane na kluczu operują zarówno na pojedynczych bajtach, jak i na całych słowach. Wobec tego, liczby zapisane w kluczu mogą być przedstawiane albo jako 64 dwubajtowe słowa:
K[0], K[1], ..., K[63]
albo jako 128 oddzielnych bajtów:
L[0], L[1], ..., L[127].
Należy zauważyć, że każda część klucza może być zaadresowana zarówno za pomocą bajtów, jak i słów. Można zdefiniować poniższą zależność:
K[i] = L[2·i] + 256·L[2·i+1]
Mniej znaczące osiem bitów każdego słowa znajduje się przed bardziej znaczącym bajtem.
Algorytm Rozszerzania Klucza
Pierwszym krokiem, który należy wykonać podczas rozszerzania klucza jest wypełnienie pierwszych Keysize bajtów tabeli klucza bajtami klucza zdefiniowanymi przez użytkownika.:
L[0], L[1], ..., L[Keysize-1].
Następnie, należy wykonać poniższe kroki na tablicy zawierającej bajty klucza. Wykorzystywana w nich tablica TPI jest stała i ma wielkość 256 elementów. Jest wypełniona losowo liczbami od 0 do 255:
- Dla i = Keysize, Keysize+1, aż do 127 powtórzyć:
L[i] = TPI[(L[i-1] + L[i-Keysize]) mod 256] - L[128-Keybyte-limit] = TPI[L[128-Keybyte-limit] & Keymask]
- Dla i = 127-Keybyte-limit, aż do 0 powtórzyć:
L[i] = TPI[L[i+1] XOR L[i+Keybyte-limit]]
Rzeczywisty klucz szyfrujący jest zawarty w bajtach klucza:
L[128-Keybyte-limit], L[128-Keybyte-limit+1]..., L[127]
Działanie & przeprowadzone w drugim kroku powyżej ogranicza rzeczywistą wielkość klucza do Keybit-limit bitów.
Szyfrowanie
Procedura szyfrowania pobiera jako wejście cztery słowa: R[0] R[1] R[2] R[3], które składają się na jeden blok danych. Każdy blok zostanie zaszyfrowany przy pomocą takich samych 64 słów rozszerzonego klucza szyfrującego: K[0] K[1] ... K[63].
Aby zaszyfrować każdy blok danych, należy wykonać następujące kroki:
- Zainicjować licznik j na 0.
- Wykonać pięć rund Mixing.
- Wykonać jedną rundę Mashing.
- Wykonać sześć rund Mixing.
- Wykonać jedną rundę Mashing.
- Wykonać pięć rund Mixing.
Każda runda Mixing używa 4 bajtów klucza, wobec tego wszystkie 128 bajtów klucza są wykorzystywane podczas szyfrowania jednego bloku danych. Runda Mashing wykorzystuje bajty klucza w bardziej nieprzewidywalny sposób.
Podczas każdej rundy Mixing wykonywane są cztery operacje Mixing, przeprowadzane na czterech słowach bloku danych:
Podczas każdej rundy Mashing wykonywane są cztery operacje Mashing, przeprowadzane na czterech słowach bloku danych:
Deszyfrowanie
Procedura deszyfrowania pobiera jako wejście cztery słowa: R[0] R[1] R[2] R[3], które składają się na jeden blok szyfrogramu. Każdy blok zostanie odszyfrowany przy pomocą takich samych 64 słów rozszerzonego klucza: K[0] K[1] ... K[63].
Aby odszyfrować każdy blok szyfrogramu, należy wykonać następujące kroki:
- Zainicjować licznik j na 63.
- Wykonać pięć rund R-Mixing.
- Wykonać jedną rundę R-Mashing.
- Wykonać sześć rund R-Mixing.
- Wykonać jedną rundę R-Mashing.
- Wykonać pięć rund R-Mixing.
Podczas każdej rundy R-Mixing wykonywane są cztery operacje R-Mixing, przeprowadzane na czterech słowach bloku szyfrogramu:
Podczas każdej rundy R-Mashing wykonywane są cztery operacje R-Mashing, przeprowadzane na czterech słowach bloku szyfrogramu:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|