RC2

Szyfr blokowy z kluczem symetrycznym

  • Długość bloku = 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:

  1. Dla i = Keysize, Keysize+1, aż do 127 powtórzyć:
        L[i] = TPI[(L[i-1] + L[i-Keysize]) mod 256]
  2. L[128-Keybyte-limit] = TPI[L[128-Keybyte-limit] & Keymask]
  3. 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:

  1. Zainicjować licznik j na 0.
  2. Wykonać pięć rund Mixing.
  3. Wykonać jedną rundę Mashing.
  4. Wykonać sześć rund Mixing.
  5. Wykonać jedną rundę Mashing.
  6. 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:

  1. Mixing R[0]
  2. Mixing R[1]
  3. Mixing R[2]
  4. Mixing R[3]

Podczas każdej rundy Mashing wykonywane są cztery operacje Mashing, przeprowadzane na czterech słowach bloku danych:

  1. Mashing R[0]
  2. Mashing R[1]
  3. Mashing R[2]
  4. 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:

  1. Zainicjować licznik j na 63.
  2. Wykonać pięć rund R-Mixing.
  3. Wykonać jedną rundę R-Mashing.
  4. Wykonać sześć rund R-Mixing.
  5. Wykonać jedną rundę R-Mashing.
  6. Wykonać pięć rund R-Mixing.

Podczas każdej rundy R-Mixing wykonywane są cztery operacje R-Mixing, przeprowadzane na czterech słowach bloku szyfrogramu:

  1. R-Mixing R[3]
  2. R-Mixing R[2]
  3. R-Mixing R[1]
  4. R-Mixing R[0]

Podczas każdej rundy R-Mashing wykonywane są cztery operacje R-Mashing, przeprowadzane na czterech słowach bloku szyfrogramu:

  1. R-Mashing R[3]
  2. R-Mashing R[2]
  3. R-Mashing R[1]
  4. R-Mashing R[0]

Schemat blokowy szyfrowania RC2

Schemat blokowy algorytmu szyfrowania RC2

Schemat blokowy deszyfrowania RC2

Schemat blokowy algorytmu 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...

Tabela PI w zapisie szesnastkowym
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]