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:

  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
d978f9c419ddb5ed28e9fd794aa0d89d
c67e37832b76538e624c6488448bfba2
179a59f587b34f1361456d8d09817d32
bd8f40eb86b77b0bf09521225c6b4e82
54d66593ce60b21c7356c014a78cf1dc
1275ca1f3bbee4d1423dd430a33cb626
6fbf0eda4669075727f21d9bbc944303
f811c7f690ef3ee706c3d52fc8661ed7
08e8eade8052eef784aa72ac354d6a2a
961ad2715a1549744b9fd05e0418a4ec
c2e0416e0f51cbcc2491af50a1f47039
997c3a8523b8b47afc02365b25559731
2d5dfa98e38a92ae05df2910676cbac9
d300e6cfe19ea82c6316013f58e289a9
0d38341bab33ffb0bb480c5fb9b1cd2e
c5f3db47e5a59c770aa62068fe7fc1ad

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]