Metody szyfrowania
Symetryczne
Ten sam klucz do szyfrowania i odszyfrowania wiadomości.
Asymetryczne
Jeden klucz do szyfrowania, inny do odszyfrowania.
Zalety i wady
- Symetryczne
- znacznie szybsze
- trudniejsze w implementacji (kwestia przekazania klucza od/szyfrowującego)
- Niesymetryczne
- bardziej złożone obliczeniowo i wolniejsze
- nie ma problemu z przekazywaniem klucza używanego do szyfrowania: jeden z kluczy jest kluczem „publicznym” — jest on (klucz publiczny odbiorcy) dostępny dla każdego chcącego zaszyfrować wiadomość do odbiorcy.
- trzeba stworzyć odpowiednią infrastrukturę do przekazywania kluczy publicznych (tak, żeby nikt się nie podszył)
Szyfry symetryczne
- Mogą działać na bitach (szyfrowanie stosowane jest do każdego z bitów komunikatu)…
- …albo na blokach; najważniejsze to
DES
- Szyfrowanie blokowe
- Blok długości 64 bitów
- Klucz długości 56 bitów (do tego dodanych jest 8 bitów kontroli parzystości)
Procedura DES
- Tekst jawny dzielony jest na bloki 64 bitowe
- Każdy blok dzielony jest na dwie połówki (32 bity) zwane lewą i prawą.
- Dokonuje się 16 cykli operacji, w których dane łączone są z kluczem
- bity klucza są przesuwane, a następnie wybieranych jest 48 z 56 bitów klucza
- prawa część danych rozszerzana jest do 48-bitów za pomocą permutacji rozszerzonej
- rozszerzona prawa połowa jest sumowana modulo 2 z wybranymi wcześniej (i przesuniętymi) 48 bitami klucza
- zsumowane dane dzielone są na osiem 6-bitowych bloków i każdy blok podawany jest na wejście jednego z S-bloków (pierwszy 6-bitowy blok na wejście pierwszego S-bloku, drugi 6-bitowy blok na wejście drugiego S-bloku itd.). Pierwszy i ostatni bit danych określa wiersz, a pozostałe bity kolumnę S-BOXa. Po wyznaczeniu miejsca w tabeli, odczytuje się wartość i zamienia na zapis dwójkowy. Wynikiem działania każdego S-bloku są 4 bity wyjściowe – tworzą one 32-bitowe wyjście S-bloków. Każdy S-Blok ma inną strukturę
- wyjście S-bloków poddawane jest permutacji w P-blokach
- bity tak przekształconego bloku są sumowane modulo 2 z bitami lewej połowy danych
- tak zmieniony blok staje się nową prawą połową, poprzednia prawa połowa staje się natomiast lewą połową – cykl dobiega końca
- Po wykonaniu 16 cykli operacji prawa i lewa połowa danych jest łączona w 64-bitowy blok
- Dokonywana jest permutacja końcowa
Aby wiadomość odszyfrować, wykonuje się powyższe w odwrotnej kolejności
Szyfry asymetryczne
- Klucz publiczny używany jest do zaszyfrowania informacji, klucz prywatny do jej odczytu.
- Ponieważ klucz prywatny jest w wyłącznym posiadaniu adresata informacji, tylko on może ją odczytać. Natomiast klucz publiczny jest udostępniony każdemu, kto zechce zaszyfrować wiadomość.
Algorytm RSA
Idea algorytmu RSA opiera się na znalezieniu dwu bardzo dużych1 liczb pierwszych.
Wybieramy losowo dwie duże liczby pierwsze $p$ i $q$.
Obliczamy ich iloczyn $n=p \cdot q$.
Obliczamy wartość funkcji Eulera dla $n: \varphi(n) = (p-1)(q-1)$
Wybieramy liczbę $e\quad 1<e<\varphi(n)$ względnie pierwszą2 z $\varphi(n)$.
Znajdujemy taką liczbę $d$, że $d \cdot e \equiv 1; (\mathrm{mod}, \varphi(n))$
Klucz publiczny to para liczb $(n,e)$, natomiast klucz prywatny to para liczb $(n, d)$.
Aby zaszyfrować wiadomość dzielimy ją na bloki $m$ o wartości liczbowej3 nie większej niż $n$. Każdy blok szyfrujemy według wzoru: $$c \equiv m^e; (\mathrm{mod}, n)$$ Każdemu blokowi $m$ odpowiada blok $c$, który jest przesyłany do odbiorcy.
Odszyfrowanie bloku polega na wykonaniu operacji „odwrotnej": $$m \equiv c^d; (\mathrm{mod}, n)$$
Sam algorytm nie jest specjalnie ważny
Jedyny kłopot to poradzenie sobie z operacjami arytmetycznymi (mnożenie, potęgowanie) wykonywanymi na bardzo dużych liczbach.
Operacja modulo to najczęściej obcięcie nadmiarowych bitów wyniku (stąd klucze długości 1024, 2048,… — są to potęgi dwójki).
Opracowano specjalne biblioteki matematyczne do wykonywania tych obliczeń.
Podpisanie wiadomości
Podpisanie wiadomości polega na wyliczeniu funkcji skrótu dla wiadomości i zaszyfrowanie jej i dodaniu do przesyłanej wiadomości.
Odbiorca odszyfrowuje wartość funkcji skrótu i porównuje ją z wyliczoną funkcją skrótu dla otrzymanej wiadomości.
Funkcja skrótu
- Funkcja skrótu, funkcja mieszająca lub funkcja haszująca – funkcja przyporządkowująca dowolnie dużej liczbie krótką wartość o stałym rozmiarze, tzw. skrót nieodwracalny.
- Zgodnie z wytycznymi NIST od 1999 roku nie powinna być stosowana funkcja MD5, zaś funkcja SHA-1 powinna być stosowana co najwyżej do 2010 roku.
- Do nowych aplikacji zalecane są funkcje skrótu z rodziny SHA-2, a w przyszłości funkcja SHA-3.
PGP (Pretty Good Privacy)
Projekt PGP został zapoczątkowany w 1991 przez Philipa Zimmermanna i rozwijany z pomocą społeczności programistów z całego świata.
Wydarzenie to stało się pewnym przełomem – po raz pierwszy zwykły obywatel dostał do ręki narzędzie chroniące prywatność, wobec którego pozostawały bezradne nawet najlepiej wyposażone służby.
Od 1994 roku program był dostępny w polskiej wersji językowej.
Począwszy od wersji 5.0 założona przez Zimmermana firma PGP Inc. zaczęła wydawać PGP na nowej, restrykcyjnej licencji.
29 kwietnia 2010 r. PGP zostało przejęte przez firmę Symantec Corporation za ponad 300 milionów dolarów.
GNU Privacy Guard
- GPG lub GnuPG (ang. GNU Privacy Guard) – wolny zamiennik oprogramowania kryptograficznego PGP.
- Udostępniony na licencji GPL.
- Projekt jest wspierany przez rząd niemiecki.
- GPG spełnia standard OpenPGP. Obecne wersje PGP mogą współpracować z systemami spełniającymi założenia standardu OpenPGP.
OpenPGP
- OpenPGP to standard definiujący kryptograficzn rozszerzenia e-maili – szyfrowanie i podpisy cyfrowe.
- Standard został oparty na istniejącym programie PGP. Obecnie istnieje wiele innych implementacji, takich jak wolna GPG.
- Standard jest zdefiniowany w RFC 4880.
Trudno powiedzieć co to znaczy „bardzo duża" liczba. W zapisie binarnym liczba o długości 768 bitów (to znaczy rzędu $2^{768}$, czyli nieco więcej niż 230 cyfr dziesiętnych) nie jest już uważana za liczbę bardzo dużą. ↩︎
Czyli taką, że jedynym wspólnym dzielnikiem obu liczb jest 1. ↩︎
Wiadomość traktowana jest jako ciąg bitów, któremu można przypisać wartość liczbową. ↩︎