Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 3

Szyfr blokowy RC6

Adam Siemion

Wstęp
Szyfr Rc6 jest szyfrem blokowym z kluczem symetrycznym.
Został zaproponowany jako kandydat do konkursu AES.
Został stworzony w 1998 roku, jako ewolucja szyfru RC5.
Wykorzystuje 16 bajtowe bloki oraz klucze 16, 24 lub 32 bajtowe.

Opis programu
Moja implementacja została napisana w języku Java.
Oprócz samej implementacji szyfru zawiera graficzne narzędzie,
które umożliwia wybór pliku, który będzie szyfrowany
bądź deszyfrowany oraz podanie klucza użytkownika jako ciągu
znaków.

Opis klas
Projekt składa się z następujących klas:
* Rc6 - implementacja szyfru (zgodną ze specyfikacją)
* Rc6Fs - operacje służące dostępu do systemu plików,
takie jak czytanie i zapis do pliku
* Rc6Helper - zawiera metody do szyfrowania i deszyfrowania,
które automatycznie dzielą przekazane dane na 16 bajtowe bloki
* Rc6Tool - implementacja graficznego interfejsu użytkownika

Szczegółowy opis implementacji


Szyfracja
1. Z klasy Rc6Tool (zawierającej implementację GUI) wywoływana
jest metoda encrypyFile()/decryptFile() z klasy Rc6Fs, jako argumenty przekazywane
są ścieżka do pliku oraz klucz użytkownika.
2. Ponieważ klucz użytkownika musi mieć 16 lub 24 lub 32 bajty konieczne jest
dostosowanie podanego przez użytkownika ciągu znaków do jednej
z w / w długości.
3. Tworzony jest obiekt klasy Rc6Helper i jako argument przekazywany
jest mu klucz użytkownika (jako tablica bajtów o rozmiarze 16).
3.1. Patrz (Opis inicjalizacji)
4. Po wczytaniu do tablicy bajtów zawartości pliku wywoływana
jest metoda encryptByte()/decryptByte() na rzecz obiektu klasy Rc6Helper.
5. Zadaniem metody encryptByte()/decryptByte() jest podział danych na bloki
po 16 bajtów, i dopełnienie ostatniego bloku (zawierającego mniej
niż 16 bajtów danych).
6. Dla każdego bloku wywoływana jest metoda syfruj() z klasy
Rc6, która działa w trybie szyfrowania lub deszyfrownia.
6.1. Patrz (Opis działania metody szyfruj w trybie deszyfracji)
6.2. Patrz (Opis działania metody szyfruj w trybie szyfracji)
7. Wszystkie zaszyfrowane bloki dodawane są do tablicy, która
zostanie zwrócona jako wynik działania metody encryptByte()/decryptBte().
8. Zwrócona tablica z danymi zostanie zapisana do pliku
jako zaszyfrowane/odszyfrowane dane.
9. Sterowanie powróci do klasy Rc6Tool i użytkownik będzie
mógł wykonywać kolejne operacje.

Inicjalizacja
Sednem inicjalizacji jest generacja podkluczy, która odbywa się
w następujący sposób.
Wykorzystywane zmienne:
* Wynikowa tablica podkluczy zostanie oznaczona S
* Tablica z kluczem użytkownika zostanie oznaczona K
* Tymczasowa tablica zostanie oznaczona L

1. Alokowana jest pamięć dla tablicy L wielkości 4 razy mniejszej


niż wielkość tablicy K
2. Inicjalizowana jest tablica L, danymi z tablicy K, ponieważ
tablica K zawiera typ byte jako element a tablica L typ int,
na jeden element tablicy L przypisywane są 4 elementy z tablicy K.
Odbywa się to wykorzystując bitowy AND i OR oraz przesunięcie bitowe
w lewo. Pierwszy bajt pierwszego elementu tablicy L jest zapisywany na
pierwszym elemencie tablicy K, drugi bajt pierwszego elementu tablicy L
jest zapisywany na drugim elemencie tablicy K itd.
L[i] = ((key[off++] & 0xFF)) | ((key[off++] & 0xFF) << 8) | ((key[off++] & 0xFF) << 16) |
((key[off++] & 0xFF) << 24);

3. Inicjalizowana jest tablica S (pamięć została


zaalokowana w momencie definicji, o wielkości 2x ilość rund + 4).
Pierwszy element inicjalizowany jest wartością magicznej stałej P.
Każdy następny element inicjalizowany jest sumą poprzedniego elementu
S oraz magicznej stałej Q.

4. W pętli wykonywana jest operacja, która wykorzystuje klucz


przekazany przez użytkownika (znajdujący się w tablicy L)
do ustawienia wartości elementów tablicy S.
Wykonywane są dwie operacje:
A = S[i] = rotl(S[i] + A + B, 3);
B = L[j] = rotl(L[j] + A + B, A + B);
gdzie, zmienna i to indeks w tablicy S,
a zmienna j to indeks w tablicy L.
Metoda rotl dokonuje przesunięcia bitowego w lewo
(bardziej szczegółowy opis w następnym punkcie).

Metoda szyfruj w trybie deszyfracji


Wykorzystywane zmienne:
* t,u - tymczasowe zmienne 4 bajtowe (typ int)
* A,B,C,D - tzw. rejestry, tymczasowe zmienne 4 bajtowe (typ int)
* S - tablica z podkluczami wygenerowana w poprzednim punkcie

1. Zmienne A,B,C,D są inicjalizowane kolejnym bajtami


z bloku z danymi (podobnie jak miało to miejsce przy generowaniu
podkluczy).
2. Rejestr C jest pomniejszany o wartość ostatniego elementu S
3. Rejestr A jest pomniejszany o wartość przedostatniego elementu S

4. Dla 2x ilosc rund wykonywana jest następująca pętla:


4.1. Wartości rejestrów ulegają permutacji w następujący sposób:
(A;B;C;D) = (D;A;B;C)
4.2. Zmiennym przypisywane są wartości w następujący sposób:
u = rotl(D * (2 * D + 1), 5);
t = rotl(B * (2 * B + 1), 5);
C = rotr(C - S[--i], t) ^ u;
A = rotr(A - S[--i], u) ^ t;
gdzie, i to indeks w tablicy S, wartość 5 to wynik operacji
(lg w) dla w równego 32.
Operacja rotl dokonuje przesunięcia bitowego w lewo, jedynki, które
znikną z powodu skończenia się zakresu z lewej strony pojawią się po prawej.
Oto kod tej operacji: return (val << amount) | (val >>> (32 - amount));
gdzie val jest wartością, która ulega przesunięciu, a amount
to o ile należy przesunąć w lewo val.
Podobnie działa operacja rotr.

5. Rejestr D jest pomniejszany o wartość drugiego elementu S


6. Rejestr B jest pomniejszany o wartość pierwszego elementu S
7. Tablica wynikowa jest inicjalizowana wartościami rejestrów A,B,C,D.

Metoda szyfruj w trybie szyfracji


Wykorzystywane są następujące zmienne:
* t,u - tymczasowe zmienne 4 bajtowe (typ int)
* A,B,C,D - tzw. rejestry, tymczasowe zmienne 4 bajtowe (typ int)
* S - tablica z podkluczami wygenerowana w poprzednim punkcie

1. Zmienne A,B,C,D są inicjalizowane kolejnym bajtami


z bloku z danymi (podobnie jak miało to miejsce przy generowaniu
podkluczy).
2. Rejestr B jest powiększany o pierwszy element tablicy S
3. Rejestr D jest powiększany o drugi element tablicy S
4. Dla 2x ilość rund wykonywana jest następująca pętla:
4.1. Zmiennym przypisywane są wartości w następujący sposób:
t = rotl(B * (2 * B + 1), 5);
u = rotl(D * (2 * D + 1), 5);
A = rotl((A ^ t), u) + S[++i];
C = rotl((C ^ u), t) + S[++i];
działanie powyższych operacji jest takie samo jak metodzie deszyfracji.
4.2. Wartości rejestrów ulegają permutacji w następujący sposób:
(A;B;C;D) = (B;C;D;A)
5. Rejestr A jest powiększany o przedostatni element tablicy S
6. Rejestr C jest powiększany o ostatni element tablicy S
7. Tablica wynikowa jest inicjalizowana wartościami rejestrów A,B,C,D.

Adam Siemion

You might also like