RC2
- Block length = 8 bajtów
- Długość klucza = od jednego aż do 128 bajtów
RC2 to symetryczny szyfr blokowy, popularny szczególnie w pierwszej połowie lat dziewięćdziesiątych XX wieku. Jego wykorzystywanie było wspierane przez rządowe instytucje amerykańskie.
Zastosowanie
Autorem szyfru RC2 jest Ron Rivest, amerykański naukowiec, który ma na swoim koncie również inne szyfry. Szyfr RC2 został zaprojektowany w 1987 roku i jego algorytm pozostawał tajny aż do 1996, kiedy to został anonimowo opublikowany na grupie sci.crypt.
Inną nazwą RC2 jest ARC2. Przyjmuje się, że litery RC pochodzą od słów "Rivest Cipher" lub "Ron's Code" (ang. kod Rona).
Algorytm
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:
- Mixing R[0]
- Mixing R[1]
- Mixing R[2]
- Mixing R[3]
Podczas każdej rundy Mashing wykonywane są cztery operacje Mashing, przeprowadzane na czterech słowach bloku danych:
- Mashing R[0]
- Mashing R[1]
- Mashing R[2]
- Mashing R[3]
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:
- R-Mixing R[3]
- R-Mixing R[2]
- R-Mixing R[1]
- R-Mixing R[0]
Podczas każdej rundy R-Mashing wykonywane są cztery operacje R-Mashing, przeprowadzane na czterech słowach bloku szyfrogramu:
- R-Mashing R[3]
- R-Mashing R[2]
- R-Mashing R[1]
- R-Mashing R[0]
Schemat Blokowy Szyfrowania RC2
Schemat Blokowy Deszyfrowania RC2
Matematyka:
Operacje wykonywane w ramach algorytmu szyfrującego RC2 zostały przedstawione od funkcji najniższego poziomu, do zbudowanych z nich funkcji wyższego poziomu.
Tabela PI (TPI)
Tabela PI jest stałą tablicą, która zawiera 256 elementów. Jest wykorzystywana podczas rozszerzania klucza szyfrującego.
Tabela PI jest wypełniona liczbami, które są losową permutacją wszystkich możliwych wartości od 0 do 255. Kolejność liczb w tablicy jest określona przez cyfry PI: 3.1415...
d9 | 78 | f9 | c4 | 19 | dd | b5 | ed | 28 | e9 | fd | 79 | 4a | a0 | d8 | 9d |
c6 | 7e | 37 | 83 | 2b | 76 | 53 | 8e | 62 | 4c | 64 | 88 | 44 | 8b | fb | a2 |
17 | 9a | 59 | f5 | 87 | b3 | 4f | 13 | 61 | 45 | 6d | 8d | 09 | 81 | 7d | 32 |
bd | 8f | 40 | eb | 86 | b7 | 7b | 0b | f0 | 95 | 21 | 22 | 5c | 6b | 4e | 82 |
54 | d6 | 65 | 93 | ce | 60 | b2 | 1c | 73 | 56 | c0 | 14 | a7 | 8c | f1 | dc |
12 | 75 | ca | 1f | 3b | be | e4 | d1 | 42 | 3d | d4 | 30 | a3 | 3c | b6 | 26 |
6f | bf | 0e | da | 46 | 69 | 07 | 57 | 27 | f2 | 1d | 9b | bc | 94 | 43 | 03 |
f8 | 11 | c7 | f6 | 90 | ef | 3e | e7 | 06 | c3 | d5 | 2f | c8 | 66 | 1e | d7 |
08 | e8 | ea | de | 80 | 52 | ee | f7 | 84 | aa | 72 | ac | 35 | 4d | 6a | 2a |
96 | 1a | d2 | 71 | 5a | 15 | 49 | 74 | 4b | 9f | d0 | 5e | 04 | 18 | a4 | ec |
c2 | e0 | 41 | 6e | 0f | 51 | cb | cc | 24 | 91 | af | 50 | a1 | f4 | 70 | 39 |
99 | 7c | 3a | 85 | 23 | b8 | b4 | 7a | fc | 02 | 36 | 5b | 25 | 55 | 97 | 31 |
2d | 5d | fa | 98 | e3 | 8a | 92 | ae | 05 | df | 29 | 10 | 67 | 6c | ba | c9 |
d3 | 00 | e6 | cf | e1 | 9e | a8 | 2c | 63 | 16 | 01 | 3f | 58 | e2 | 89 | a9 |
0d | 38 | 34 | 1b | ab | 33 | ff | b0 | bb | 48 | 0c | 5f | b9 | b1 | cd | 2e |
c5 | f3 | db | 47 | e5 | a5 | 9c | 77 | 0a | a6 | 20 | 68 | fe | 7f | c1 | ad |
Rotacja Bitów w Lewo: <<<
Rotacja w lewo o a bitów 2-bajtowego słowa w jest przedstawiona w opisie algorytmu jako w <<< a. Podczas rotacji, a najbardziej skrajnych lewych bitów przechodzi na prawą stronę słowa.
Rotacja Bitów w Prawo: >>>
Rotacja w prawo o a bitów 2-bajtowego słowa w jest przedstawiona w opisie algorytmu jako w >>> a. Podczas rotacji, a najbardziej skrajnych prawych bitów przechodzi na lewą stronę słowa.
Operacja Mixing
Operacja Mixing modyfikuje jedno słowo danych oraz zwiększa licznik j podczas procesu szyfrowania.
Trzy poniższe operacje są przeprowadzone podczas Mixing:
R[i] = R[i] + K[j] +
+ (R[(i+4-1) mod 4] & R[(i+4-2) mod 4])
+ ((~R[(i+4-1) mod 4]) & R[(i+4-3) mod 4])
j = j + 1
R[i] = R[i] <<< s[i]
gdzie j oznacza zmienną licznika, natomiast wektor s zawiera następujące wartości: s[0] = 1, s[1] = 2, s[2] = 3, s[3] = 5.
Operacja Mashing
Operacja Mashing modyfikuje jedno słowo danych podczas procesu szyfrowania.
Następujące działanie jest przeprowadzane podczas Mashing:
R[i] = R[i] + K[R[(i+4-1) mod 4] & 63]
Operacja R-Mixing
Operacja R-Mixing modyfikuje jedno słowo szyfrogramu oraz zmniejsza licznik j podczas procesu deszyfrowania.
Trzy poniższe operacje są przeprowadzone podczas R-Mixing:
R[i] = R[i] >>> s[i]
R[i] = R[i] - K[j]
- (R[(i+4-1) mod 4] & R[(i+4-2) mod 4])
- ((~R[(i+4-1) mod 4]) & R[(i+4-3) mod 4])
j = j - 1
gdzie j oznacza zmienną licznika, natomiast wektor s zawiera następujące wartości: s[0] = 1, s[1] = 2, s[2] = 3, s[3] = 5.
Operacja R-Mashing
Operacja R-Mashing modyfikuje jedno słowo szyfrogramu podczas procesu deszyfrowania.
Następujące działanie jest przeprowadzane podczas R-Mashing:
R[i] = R[i] - K[R[(i+4-1) mod 4] & 63]