CypherFloor - program szyfrujący hasła

2009-07-18 , Papiewski Łukasz , Programowanie / Kodzenie

CypherFloor jest prostym, wydajnym, poręczny, zajmującym pół kB na dysku programem umożliwiającym szybkie zapisywanie haseł w postaci zaszyfrowanej, używajac do tego najlepszego na dzień dzisiejszy algorytmu AES.

AES

Szczegółowa zasada działania AES 128

AES jest szyfrem blokowym, co oznacza, że działanie opiera się na serii operacji macierzowych. Przyjęto podstawową jednostkę bloku o rozmiarze 4 bajty na 4. Oczywiście istnieją także możliwości zastosowania algorytmu do macierzy 4×6(192 bity) czy 4×8 (256), jednak w praktyce wykorzystuję się to pierwsze podejście. Numer wersji AES oznacza rozmiar użytego klucza. Oprócz wersji 128 bitowej istnieją jeszcze wersję AES 192 oraz AES 256. Różnica nakłada większą liczbę rund operacji na jednostce wejściowej algorytmu. I tak wersja 128 ma 10 takich rund, 129 - 12 a 256 14. Co uwidacznia, że względna różnica mocy zabezpieczenia hasła jest niewielka biorąc pod uwagę fakt, że i tak wszystkie komputery świata nie złamią hasła w czasie miliardów lat. Nasze hasła mogą i my mogą spoczywać spokojnie. Podejmując watek bezpieczeństwa należy pamiętać, że nie systemy bezpieczeństwa są w większości podatne lecz omyłkowość i nieświadomych użytkowników. Dlatego w naszym programie postawiliśmy sobie za cel także inteligentne zarządzanie sesją oraz ograniczenie do zera wszelkich możliwości ataku.

Poniżej opis algorytmu, będący zwycięzcą konkursu zorganizowanego przez NIST (National Institute of Standard and Technology). Niezwykle prosty w zakodowania i potężny w działaniu:


Rozpoczynamy od podziału danych wejściowych na standardowe bloki 4×4. Wcześniej dokonujemy rekursywanego przygotowania klucza do każdej rundy, której będą poddane kolejne bloczki.

Większość tych operacji jak, już wspomniałem jest operacjami macierzowymi. Bardzo ułatwiające implementację takich działań matematycznych jest szybka biblioteka operująca na takowych strukturach. Warto przypomnieć, że nie wymagana jest tu żadna wielki typ danych liczbowych (jak wychwalany Big Integer w Javie), gdyż operujemy na bajtach. Najodpowiedniejszym wydał się tu język C++ wykorzystujący klasę 'vector' z biblioteki STL+. Jeśli chodzi o szybkość masowo wykorzystywanej, podstawowej operacji pobieranie elementu z tablicy możemy wykorzystać funkcję() oraz operator tablicowania[]. Korzystniej wypada pierwszy operator, zwłaszcza przy dwuwymiarowym odwołaniu co zostało wykorzystane w naszym programie (tab(x,y) zamiast tab[x][y]).

1.Ekspansja klucza Należy przygotować tablicę 10 macierzy na klucze. Każdy następny klucz powstaje na podstawie poprzedniego wygenerowanego. Początkowym jest klucz przez z nas podany. Na podstawie pierwszej i ostatniej kolumny każdego klucza wejściowego oraz poniższych operacji, tworzona jest pierwsza kolumna nowego klucza:

-rotacja kolumny 4 o 1 do góry

-hashowanie wartości 4 kolumny przy pomocy tzw. tablicy Sand Box

-logiczny XOR elementów kolumny 1 , 4 i danej tablicy Rcon.

Drugie, trzecie i czwarte kolumny nowo powstałych kluczy są tworzone przez prosty XOR dwóch poprzednio wygenerowanych kolumn wg. schematu.

newKey[n]=newKey[n-1] ^ key[n-1]

gdzie:

n - numer generowanej kolumna w kluczu (może być 2,3,4)

key - macierz klucza wejściowego (4×4)

newKey - macierz nowego klucza

Następnie nasze dane wejściowe mogą zostać poddane serii przekształceń:

-SubBytes - hashowanie wartościami z Sbox

-ShiftRows - rotacja kolumn o wartość numeru kolumny do góry

-MixColumns - mnożenie każdej kolumny przez macierz

2 3 1 1

1 2 3 1

1 1 2 3

3 1 1 2

-Dodawanie klucza rundy (XOR)

W ostatniej rundzie tworzeniu zaszyfrowanego tekstu w algorytmie nie ma MixColumns.
Implementacja:

SHA

SHA - Secure Hash Algorithm - stworzony przez NSA algorytm skrótu. Rodzaj algorytmu nacechowany na ujednolicenie długości generowanego hasła niezależnie od długości wejściowej. Dodatkowo wrażliwy na wszelkie podobieństwa słów wejściowych (czyli jak u nas hasła głównego). Nawet przy podobnych wyrazach w haśle, lub nawet identycznych początkach lub różnicy jednej litery generowany jest zupełnie odmienny hash. Przykładowo: zmiana dowolnego pojedynczego bitu wiadomości zmienia średnio połowę bitów skrótu w sposób. Dlatego kryptoanaliza różnicowa praktycznie jest tutaj bezużyteczna. Ponadto algorytm ten posiada właściwości funkcji jednokierunkowej.
Zgodnie z wytycznymi NIST (National Institute of Standards and Technology) od 1999 roku nie powinna być stosowana funkcja MD5, zaś funkcja SHA-1 powinna być stosowana co najwyżej do 2010 roku. Zalecana rodziną funkcji jest SHA-2. W chwili obecnej instytut ten prowadzi publiczny konkurs na następcę dotychczasowych funkcji skrótu, w duchu podobnym do procesu wyłaniania algorytmu szyfrującego AES. Zostało zgłoszonych kilkadziesiąt kandydatur, którę są w tej chwili rygorystycznie ewaluowane. Zwycięzki algorytm będzie nosił miano SHA-3.
W naszym programie użyliśmy zalecanego algorytmu SHA-2 o długości skrótu 256 bitów.

Master Password - klucz główny

Przy pierwszym uruchomieniu programu tworzony jet katalog roboczy .cypherfloor w katalogu domowym użytkownika oraz wyświetla się monit o dwukrotne podanie hasła głównego. Hasło główne jest krytycznym elementem, kluczem służącym do rozszyfrowania pozostałych haseł w bazie. Jeżeli hasło zostanie zapomniane nie ma możliwości odzyskania bazy.

Klucz główny podany przez użytkownika najczęściej w formie znaków ASCII jest haszowany SHA-2 i skrót jest zapisywany do pliku .masterPassword katalogu roboczego. Umożliwia to walidację hasła głównego i jednocześnie zapobiega możliwości odszyfrowania tegoż hasła, co mogłoby stanowić problem dla osób korzystających z tych samych haseł w kilku miejscach. Z tego skrótu pobierana jest potrzebna do klucza algorytmu szyfrującego ilość bajtów i zapisana jako programowa zmienna używana do kodowania i odkodowania naszych haseł. Użycie SHA jest sprawdzoną, dobrą metodą na walidację haseł (np plik 'shadow' na unix'ach).

Cytaty

- Simplicity is the ultimate sophistication. - Leonardo da Vinci,
- Popularny człowiek wzbudza zawiść potężnych - Thufir Hawat o Leto Atrydzie (na Kaladanie),
- Szczęście następuje po smutku, a smutek po szczęściu; człowiek jest naprawdę wolny, gdy przestaje rozróżniać między smutkiem a szczęściem, między dobrem a złem - Aforyzmy buddyjskie.