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
- 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
- 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
- Wywoływany jest konstruktor klasy z argumentem zawierającym nazwę pliku, dane są zczytywane z pliku i zapisane w pamięci.
- 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.
- 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