Kolejny tydzień się kończy, a baza danych nadal nie napisana. Dlaczego znowu? System autoryzacji użytkownika napisany na Linuksie nie chciał działać na Windowsie i trzeba było przepisać go od nowa. Ale teraz działa i chciałbym opisać teraz w jaki sposób.
Zacząć należy od tego, że hasło jest siłą systemu szyfrowania jaki chcę zaimplementować. Na jego podstawie losowany jest kod, który służy do szyfrowania i odszyfrowywania.
Można by pomyśleć, że skoro bez hasła i tak nie uda się poprawnie rozszyfrować pliku, to po co w ogóle sprawdzać poprawność podanej kombinacji?
Powód jest bardzo prozaiczny: każdemu zdarza się pomylić, a próba odkodowania pamiętnika przy użyciu błędnego kodu może mieć różne skutki, przy czym program na pewno się zawiesi, a zatem nie będzie możliwa ponowna próba wpisania hasła. Trzeba je więc sprawdzić i poinformować użytkownika o ewentualnej pomyłce.
Zacznijmy od tego jak działa szyfr. Otóż opiera się on na metodzie int db:Base::getCode(int ch)
, która zwraca wartość przesunięcia dla znaku o indeksie ch
. W przypadku szyfrowania właściwego pliku dodane zostaną także metody char db:Base::Code(char c)
i char db::Base::deCode(char c)
, zwracające wartość przesuniętej już litery, póki co nie było to jednak konieczne, gdyż używane dotychczas znaki mieszą się w spójnym przedziale.
Następnie system autoryzacji, którego fragmenty znajdują się w zalążkach funkcji zapisującej (int db::Base::Save(string filename)
) i odczytującej (int db::Base::Load(string filename)
) pamiętnik z pliku. Pierwsza z nich generuje 479 losowych bajtów o wartościach z przedziału od 33 do 126 (poza tym przedziałem znajdują się znaki, które uniemożliwiają odczyt pliku na Windowsie - na Linuksie działało), kodując je na bieżąco poprawnym hasłem. Do zakodowanej wersji dodaje 0 oraz sumę MD5 wersji odkodowanej. Tak wygenerowany łańcuch zapisywany jest do pliku.
Funkcja ładująca natomiast pobiera pierwsze 479 bajtów i odkodowuje je podanym hasłem, pomija bajt "0" i wczytuje pozostałe bajty - sumę pierwszych bajtów odkodowanych poprawnym hasłem. Na końcu porównuje ją z sumą odkodowanych na początku bajtów. Jeżeli są różne - hasła się na pewno nie zgadzają (zwracane jest -1). Jeżeli są równe, to najprawdopodobniej hasło jest poprawne i odczytywanie pamiętnika jest kontynuowane.
W ten prosty sposób można sprawdzać poprawność hasła nie zapisując go w żadnej postaci w pliku pamiętnika.
PS: Obecna wersja Logtree działa w pętli umożliwiającej zapisywanie i odczytywanie plików z podanymi hasłami. Nie ma dostępu do edycji postów. Aby zapisać testowy plik należy użyć komendy save plik haslo
, gdzie plik jest nazwą pliku bez rozszerzenia. Podobnie wczytujemy pliki przy pomocy load plik haslo
. Krzaki wyrzucane na ekran to odkodowane 479 bajtów i ich suma kontrolna. Program można zamknąć przy pomocy quit
.
Brak komentarzy:
Prześlij komentarz