sobota, 1 czerwca 2013

Szyfrowanie plików C++

Szyfrowanie plików w różnych systemach c++

Program napisany w środowisku Borland C++ Builder, którego zadaniem jest szyfrowanie plików tekstowych. Początkowo miał być to program szyfrujący jedynie XOR, lecz postanowiłem dodać kilka ciekawych funkcji szyfrowania.

Poniżej przykładowe screeny i wyniki działania programu. 




 
Dokumentacja ogólna


Specyfikacja ogólna
Według założeń, aplikacja ma służyć do szyfrowania i deszyfrowania plików tekstowych określonych parametrami wywołania programu. Początkowo aplikacja miała szyfrować tylko XOR, lecz została rozbudowana tak, że obsługuje kilka rodzajów szyfrowania.
Program powinien:
-wczytać plik określony przez użytkownika
-przerobić zawartość pliku za pomocą wybranej przez użytkownika metody
-zapisać dane do pliku wynikowego


Metoda wykorzystania
Program jest aplikacją konsolową uruchamianą z parametrami.
W przypadku braku parametrów, wyświetla użytkownikowi pomoc, w której opisane są znaczenia poszczególnych parametrów, jak i tryby pracy programu.


Program należy uruchomić z parametrem, gdzie:
-pierwszym jest ścieżka pliku do zaszyfrowania
-drugim tryb
-trzecim hasło/liczba


Tryby:
sb - szyfruj binarnie
ob - odszyfruj binarnie
xor - szyfruj/odszyfruj XOR
sp xxx - szyfruj przestawieniowo
op xxx - odszyfruj przestawieniowo
sm xxx - szyfruj mieszając tekst
om xxx - odszyfruj mieszając tekst
XXX oznacza liczbę przesunięć, przestawienia, liczbę mieszania. Liczba powinna być podana zamiast hasła.


Hasło do szyfrowania plików nie powinno zawierać spacji. W przeciwnym wypadku spacja tekst zostanie zaszyfrowany/odszyfrowany hasłem które zawarte jest w przedziale od pierwszego znaku hasła do wystąpienia znaku spacji.


W sytuacji gdy użytkownik źle poda liczbę przesunięcia – np. zamiast niej literę – w zależności od typu szyfrowania – tekst zostanie przerobiony bez zmian.


Program po przerobieniu tekstu – zapisuje wynik do pliku określonego przez typ szyfrowania.
Dla szyfrowania binarnego – BIN.txt
Dla odszyfrowania binarnego – BIN_odszyfrowany.txt
Dla XOR - XOR.txt
Dla szyfrowania przestawieniowego – przestawienieASCII.txt
Dla odszyfrowania przestawieniowego – przestawienieASCII_odszyfrowany.txt
Dla szyfrowania przez mieszanie znaków – Odwrocone.txt
Dla odszyfrowania przez mieszanie – Odwrocone_odszyfrowany.txt

Struktura programu
Program wykorzystuje vcl i stdio. Dodatkowo dołączone jest Szyfrowanie.h, gdzie zawarta jest klasa wykorzystywana przez program.
Klasa składa się z funkcji szyfrujących i deszyfrujących, oraz obiektów typu StringList które zawierają tekst odszyfrowany i zaszyfrowany. Dodatkowo są dwie zmienne odpowiedzialne za przechowywanie klucza – jedna typu tekstowego a druga typu liczbowego(do przestawień, mieszań itp.)
Klasa składa się z głównych funkcji publicznych – które może wykorzystywać programista, nie wpływając na całość działania procesów szyfrowania. Klasa dodatkowo posiada funkcje prywatne – które odpowiadają za proces szyfrowania tekstów i są zawierane w funkcjach publicznych.

Program główny składa się z instrukcji warunkowych oraz funkcji odwołujących się do klasy szyfrującej. Dodatkowo określone są funkcje wyświetlające komunikaty.

Ogólny algorytm
  1. Program jest uruchamiany – sprawdzane są parametry – jeżeli istnieją program przechodzi do kroku 2, jeżeli nie istnieją – użytkownik dostaje komunikat z pomocą programu
  2. Jeżeli powyższy warunek jest spełniony, sprawdzany jest pierwszy parametr odpowiedzialny za przechowanie ścieżki do pliku. Sprawdzane jest czy plik istnieje, jeżeli nie – użytkownik dostaje komunikat o błędzie, jeżeli istnieje plik – program przechodzi do następnego 3 kroku
  3. Wywoływany jest konstruktor klasy z argumentem zawierającym nazwę pliku, dane są zczytywane z pliku i zapisane w pamięci.
  4. Sprawdzany jest drugi parametr – w zależności od tego parametru rozpoczynany jest kolejny krok – czyli wybierana jest odpowiednia funkcja i w zależności od 2 parametru zczytywany jest odpowiedni typ klucza zawarty w parametrze trzecim. Jeżeli podany parametr nie istnieje – zwracany jest komunikat i program jest zakańczany.
  5. Jeżeli powyższe warunki są spełnione, przebiega proces szyfrowania, następnie dane są zapisywane do odpowiedniego pliku i program jest zakańczany, z komunikatem „Naciśnij dowolny klawisz...”
Wybrane algorytmy przetwarzania
Większość funkcji stanowi proste przetwarzanie tekstu, które raczej powinno być zrozumiałe. Niektóre funkcje odszyfrowujące zawierają w sobie funkcję służącą do szyfrowania, tylko że z odwrotnym argumentem liczbowym. Funkcje publiczne z klasy szyfrującej – zawierają funkcje prywatne tej samej klasy, które służą do określonego przerabiania jednej linijki tekstu. Dlatego w funkcjach publicznych został zrobiony algorytm przetwarzania całego StringList za pomocą funkcji prywatnych klasy szyfrującej.
Dokumentacja techniczna kodu
ProgramSzyfrujacy(AnsiString);
Konstruktor klasy szyfrującej, jako argumet dostaje nazwę pliku z tekstem do zaszyfrowania/odszyfrowania
void ZapiszDoPliku(AnsiString);
Funkcja zapisująca tekst z obiektu StringList do pliku którego nazwa określona jest w argumencie funkcji.
void Szyfruj_PrzestawASCII();
Funkcja szyfrująca która przestawia o określoną w haśle ilość znaków w ASCII. 

void Odszyfruj_PrzestawASCII();
Funkcja odszyfrowująca tekst zaszyfrowany powyższą funkcją.

void Odszyfruj_Odwroc();
Funkcja odszyfrowująca tekst zaszyfrowany funkcją Szyfruj_Odwroc()

void Szyfruj_Odwroc();
Funkcja szyfruje przez odwrócenie kolejności znaków na podstawie hasła.

void Szyfruj_BIN();
Funkcja szyfrująca tekst na tekst w postaci „tekstu binarnego” czyli na ciągi zer i jedynek zapisane w pliku tekstowym. 

void Odszyfruj_BIN();
Funkcja odszyfrowująca tekst zaszyfrowany powyższą funkcją

void Szyfruj_XOR();
Funkcja szyfrująca i odszyfrowująca XOR

AnsiString klucz;
zmienna zawierająca klucz typu tekstowego.
int klucz2;
     Zmienna zawierająca klucz typu liczbowego.

AnsiString SzyfrujPrzesunieciowym(int,AnsiString,bool);
Funkcja szyfrująca ciąg znaków szyfrem przesunięciowym, jako pierwszy argument podaje się przesunięcie w ASCII, jako drugi – tekst do zaszyfrowania, jako trzeci – określenie czy program będzie szyfrował znaki specjalne(true szyfruj, false nie szyfruj)

AnsiString OdszyfrujPrzesunieciowym(int,AnsiString,bool);
Funkcja odszyfrowująca ciąg znaków za pomocą powyższej funkcji,

AnsiString SzyfrujBinarnie(AnsiString,bool);
Funkcja szyfrująca binarnie podany ciąg znaków jako pierwszy argument. Jako drugi argument podaje się warunek czy kazdy znak zapisany binarnie ma być separowany spacją.

AnsiString OdszyfrujBinarnie(AnsiString);
Funkcja odszyfrowuje plik zapisany binarnie.

AnsiString SzyfrujXOR(AnsiString,AnsiString);
Funkcja szyfrująca i odszyfrowująca za pomocą XOR tekst. Pierwszym argumentem jest ciąg znaków do zaszyfrowania, drugim jest hasło. Funkcja nie jest wykorzystywana. Na początku zostaje wykonane szyfrowanie binarne, następnie szyfrowanie XOR

AnsiString OdszyfrujXOR(AnsiString,AnsiString);
Funkcja odszyfrowująca XOR zaszyfrowanego tekstu powyższą funkcją.

AnsiString StworzHasloDlugosci(AnsiString,int);
Funkcja zawarta w powyższych funkcjach szyfrowania XOR, Funkcja tworzy hasło o określonej długości w drugim argumencie, z hasła określonego w pierwszym argumencie, czyli kopiuje znaki zawarte w pierwszym argumencie do uzyskania odpowiedniej długości.

AnsiString SzyfrujPrzestawOdwrotnie(AnsiString,int);
Funkcja zwraca przestawiony tekst np dla parametru ==2 tekst abcd bedzie wygladal badc a np abc na bac

AnsiString XOR(AnsiString, AnsiString);
Używana prostsza funkcja szyfrowania XOR. Pierwszym argumentem jest tekst do zaszyfrowania, drugim hasło.

AnsiString OdszyfrujPrzestawOdwrotnie(AnsiString,int);
Funkcja odszyfrowuje przestawiony tekst za pomocą funkcji SzyfrujPrzestawOdwrotnie

TStringList *tekst_oryg;
Zawiera linijki z tekstu który został wczytany z pliku

TStringList *tekst_zasz;
Zawiera linijki tekstu który został odszyfrowany/zaszyfrowany
Testowanie i weryfikacja
Testy odbywały się na wielu różnych tekstach, różnej długości. Sprawdzane było szyfrowanie z przestawieniem, gdzie wymaganym hasłem była cyfra – przez co została zmieniona konwersja znaków na int – na konwersję z domyślną wartością w przypadku gdy zamiana się nie powiedzie.

Podsumowanie
Założenia programu zostały wykonane, następnie program został zmieniony i wszystko zostało rozbudowane. Klasa szyfrująca została zmieniona, dodano więcej opcji rozszerzających możliwości. Klasa może zostać bardziej rozbudowana, mogą zostać dodane kolejne funkcje szyfrujące, które pozwolą ulepszyć program. Klasę można wykorzystać do budowy aplikacji okienkowej w c++ builderze, z bardziej przyjaznym interfejsem dla użytkownika. Wcześniej, program szyfrował całość jako tekst, łącznie ze znakami specjalnymi typu znak nowej linii, lecz z powodu problemów z odszyfrowaniem, dalszy postęp w tym kierunku został zaniechany.



Brak komentarzy:

Prześlij komentarz