Projekt edukacyjny w pythonie mający na celu eksplorację różnych sposobów szyfrowania plików.
Data Encryption Standard to algorytm szyfrowania symetrycznego opracowany we wczesnych latach 70. Bazowany jest na wcześniejszym algorytmie znanym jako Sieć Feistela. Obecnie jest powszechnie uznawany za
DES w teorii używa 64-bitowego klucza, w praktyce jednak ostatnie 8 bitów nieużywane jest w procesie szyfrowania. W pierwszym kroku tekst jawny dzielony jest na 64-bitowe bloki. Jeśli rozmiar szyfrowanych danych nie jest wielokrotnością 64 to ostatni blok jest wypełniony aby był. Następnie dla każdego bloku wykonywany jest następujący algorytm:
-
Podziel blok wejściowy na lewą i prawą część
$L_0$ i$P_0$ -
Przesuń bity klucza zgodnie z tabelą permutacji (po tym kroku klucz będzie miał 56 bitów).
-
Podziel klucz na dwie, 28-bitowe części
$C_0$ i$D_0$ -
Wykonaj następne 3 kroki 16 razy
- Wykonaj przesunięcie cykliczne w lewo
$C_i$ i$D_i$ o 1 w iteracji=1, 2 i 16, i o 2 w każdej innej, uzyskując podklucze$C_i$ i$D_i$ - Złącz ze sobą podklucze
$C_i$ i$D_i$ uzyskując klucz$K_i$ - Stwórz lokalne dla iteracji
$L_i = R_{i-1}$ i$R_i = f(R_{i-1}, K_i)$ gdzie f zdefiniujemy poniżej
- Wykonaj przesunięcie cykliczne w lewo
-
Po wykonaniu tych iteracji otrzymujemy blok wyjściowy
$O = R_{16} + L_{16}$ -
Blok wyjściowy permutujemy finalnie za pomocą tabeli permutacji.
Funkcja
- Rozszerz
$D$ do 48 bitów używając tabeli permutacji, wynik tej opracji nazwijmy$E$ - Wykonaj xor
$E$ i$K$ , nazwijmy wynik X. - Podziel X na 8 grup po 6 bitów od
$B_1$ do$B_8$ . Dokonaj konwersji X na 32-bitową liczbę w następujący sposób: z tych najstarszego i najmłodszego bitu złóż liczbę 2-bitową (0..3). Liczba ta wskazuje na rząd w tabeli dekodowania$S_i$ . Na kolumnę w owej tableki wskazuję środkowe 4 bity. Z tabeli tej odczytaj liczbę która będzie z przedziału 0..15 (4-bity). Złóż wszystkie wyniki w kolejności, wynik nazwijmy$O$ - Wykonaj permutację
$O$ zgodnie z tablą permutacji, otrzymana permutacja to wynik funkcji.
Zarówno DES jak i AES korzystają z trybów szyfrowania. Są to warianty algorytmu w które różnią się sposobem tworzenia bloków wejściowych lub wyjściowych. W projekcie zastosowano trzy rózne tryby szyfrowania.
ECB - z ang. Electronic Codebook. Jest to tryb w którym każdy blok tekstu jawnego szyfrowany jest oddzielnie w jeden blok szyfrogramu.
CBC - z ang. Cipher Blokck Chaining. W tym trybie pracy każdy blok wejściowy jest XORem poprzedniego bloku szyfrogramu i obecnego bloku tekstu jawnego. Pierwszy blok zamiast poprzedniego bloku szyfrogramu używa tzw. wektora inicjalizyjnego.
Ctr - z ang. Counter. W tym unikalnym trybie pracy tekst jawny nie jest wejściem algorytmu szyfrowania blokowego. Zamiast tego używa się połączenia bajtów nonce wraz z licznikiem który inkrementowany jest co blok. Wyjście algorytmu szyfrującego XORuje się z blokiem tekstu jawnego.
- Szyfrowanie i deszyfrowanie plików
- Dostępne algorytmy: AES i DES
- Dostępne tryby szyfrowania: ECB, CBC i CTR
- Specjalna funkcjonalność demonstracyjna dla obrazów w formacie .bmp.
Interfejs aplikacji napisany jest za pomocą biblioteki PySide6, funkcje kryptograficzne wzięte są z biblioteki pycryptodome.
Projekt wymaga pythona 3.11+, oraz bibliotek: PySide6 i pycryptodome.
pip install -r requirements.txt
<path_to_interpreter> main.pyStrona z obrazami testowymi: https://openclipart.org
Dobry opis DES: https://pl.wikipedia.org/wiki/Data_Encryption_Standard
Kolejny dobry opis DES: https://billstclair.com/grabbe/des.htm