Powrót do Kryptografia

proste szyfry podstawieniowe z wykorzystaniem vb.net i ASCII

Szyfry podstawieniowy to najprostszy i jednocześnie najłatwiejsze do zastosowania rodzaje szyfrów, znane już w starożytności. Ich historia sięga starożytnego Rzymu, w którym najsłynniejszy algorytm szyfrujący zastosował Juliusz Cezar. Opierał się on na zastąpieniu każdej litery, inną położoną o trzy miejsca dalej w alfabecie. Szyfry tego typu są łatwe do zastosowania, ale jednocześnie bardzo łatwe do złamania przy użyciu analizy statystycznej. Dopiero stosując je w informatyce, na pewnych poziomach możemy odnieść efekty skutecznego szyfrowania. Szyfr podstawieniowy nie jest specjalnie skomplikowany, aby go zastosować, obie strony muszą mieć wspólny alfabet i umówioną cyfrę. Szyfrowanie polega na za podstawieniu liter tekstu jawnego innych liter alfabetu przesuniętych o określoną wartość.

 Zaszyfrować wiadomość jest stosunkowo prosto, trochę trudniej jest taką wiadomość odszyfrować. Szyfr ten ma bardzo dużo słabych stron. Oczywiście, aby utrudnić odszyfrowanie wiadomości można użyć kilku trików jak usunięcie spacji i indywidualny alfabet, ale nawet to tylko opóźni odszyfrowanie wiadomości. Im dłuższa jest zaszyfrowana wiadomość, tym łatwiej jest ją odszyfrować. Wystarczy spojrzeć na częstotliwość występowania określonych liter w języku polskim.

a ą b c ć d e
8,91% 0,99% 1,47% 3,96% 0,40% 3,25% 7,66%
ę f g h i j k
1,11% 0,30% 1,42% 1,08% 8,21% 2,28% 3,51%
l ł m n ń o ó
2,10% 1,82% 2,80% 5,52% 0,20% 7,75% 0,85%
p q r s ś t u
3,13% 0,14% 4,69% 4,32% 0,66% 3,98% 2,50%
v w x y z ź ż
0,04% 4,65% 0,02% 3,76% 5,64% 0,06% 0,83%

Teraz do wiadomości należy dobrać litery do cyfr z częstotliwością ich występowania i poszukać znajomych krótkich słów kluczy, które pomogą nam w rozszyfrowaniu wiadomości i uzyskaniu klucza. Dużo trudniej jest odszyfrować szyfr przestawny z kluczem. Aby zastosować tego typ szyfr, obie strony muszą posiadać wspólny alfabet i hasło. Jedna strona, używając wspólnego alfabetu, najpierw zamienia hasło na wartości liczbowe odpowiadające literom w słowniku, na ich podstawie przestawia litery w wiadomości na podstawie powtarzającej się sekwencji przesunięć w haśle.

szyfr2

Komputer oferuje nam jednak dużo większe możliwości niż kartka papieru. Jeśli chcemy zaszyfrować wiadomość, przy użyciu szyfru przestawnego obie strony zawsze mają wspólny alfabet. Każdy znak generowany w komputerze ma swoją reprezentację w 7-bitowym kodzie przyporządkowującym liczby z zakresu 0−127 zwanym ASCII (czyt. aski; ang. American Standard Code for Information Interchange). Jest on jednakowy dla wszystkich komputerów niezależnie od kraju użytkowania i zawiera takie znaki specjalne jak spacja, tabulator itp. Jeśli spojrzymy na tabele kodów ASCII, znaki w niej podane są w następujący sposób:

Bin Dec Hex Znak
01100001 97 61 a

Gdzie Bin oznacza system dwójkowy, Hex system szesnastkowy, Dec system dziesiętny. Aby Wyświetlić cyfrową reprezentację słowa „szyfr” skorzystamy z kodu poniżej, wyświetli on wartości numeryczne znaków w tabeli ASCII, hex i Bin.

ASCII ma taką zaletę, że każda ze stron dysponuje takim samym słownikiem. Stworzenie własnego alfabetu daje możliwość zwiększenia skuteczności szyfrowania, jeśli jednak druga strona nie dysponuje takim samym alfabetem, może nie odczytać wiadomości. Sposób, w jaki przestawimy nasze wartości, zależy tylko i wyłącznie od nas. Możemy przestawiać zarówno pojedyncze cyfry, jak i grupy.

Zastosowanie szyfru Cezara prezentuje poniższy kod:

Wykorzystując ASCII mamy ograniczoną ilość znaków w słowniku, jest ich 127 dlatego nasz klucz, musi mieć ograniczenie długości. Osiągamy to, wykorzystując operator Mod, zwraca on resztę z dzielenia jednej liczby przez drugą:

I jest równoważne formule matematycznej:   a Mod b  =  a – (b * Fix(a / b))  gdzie Fix oznacza zaokrąglenie w dół.

56 Mod 127 =  56-(127*Fix(56/127))=56-(127* Fix(0,4409448819)) = 56-(127*0)= 56

Zastosowanie klucza komplikuje szyfr. Aby zastosować klucz szyfrujący, musimy go najpierw przekształcić na kod ASCII i również zastosować Mod dla naszego klucza:

W efekcie nasze zdanie zostanie skutecznie zaszyfrowane:

„Szyfr z kluczem szyfrującym”= 7][JU^MPXE^HOV\]ITYMCG\O

Sami przyznacie, że ciężko by było odszyfrować taki tekst. Niestety wadą wykorzystania ASCII jest brak znaków narodowych, jeśli zechcemy użyć litery „ą” w zdaniu otrzymamy:

Szyfr z kluczem szyfrującym = 7][JU^MPXE^HOV\]ITYMG\O = (po rozszyfrowaniu) = Szyfr z kluczem szyfruj:cym

Nasza literka „ą” została zastąpiona znakiem „:” aby tego uniknąć, należy użyć systemu kodowania UTF-8,  który zawiera w sobie ASCII i łącznie ma 1 112 064 znaków lub rozszerzenia ASCII- ISO 8859-16, które wykorzystując pierwszy nieprzypisany bit, dodaje 129 dodatkowych znaków wykorzystywanych w Południowo-wschodniuj Europie. UTF-8 wykorzystuje od 8 do 32 bitów, więc budowa znaku w tym kodzie jest bardziej skomplikowana, wykorzystanie ISO również czasem sprawia kłopoty, dlatego ominiemy te dekodery i wykorzystamy sobie wyłącznie ASCII. Można również wykorzystać Unicode lub inne odmiany UTF. Jeśli używamy języka vb.net, do szyfrowania wiadomości można zastosować wyłącznie Chr() i ChrW(), które zwiększają zakres ilości znaków: Chr() od 0 do 255 a ChrW() od  -32768 do 65535.

Wykorzystanie konkretnego systemu kodowania:

Listę systemów kodowania wykorzystywanych w vb.net można znaleźć pod adresem: https://msdn.microsoft.com…..

Wykorzystanie UTF-8

Zauważymy, że pierwsza litera kodowana jest jako jedna wartość ASCII, następna przez dwie a ostatnia przez trzy. Jeśli byśmy chcieli taką wiadomość zakodować, a następnie odkodować przysporzyłoby nam to trochę problemów, gdyż w zamian za trzy litery dostalibyśmy sześć liter. Oczywiście problem ten można usunąć, ale nie jest on tematem tego artykułu.

Więcej o systemach kodowania znaków, tabelach znaków można poczytać w Wikipedi: https://pl.wikipedia.org/wiki/ASCIIhttps://pl.wikipedia.org/wiki/ISO_8859

Kolejnym przykładem szyfru przestawnego jest szyfr wykorzystujący autoklucz. Znany również jako szyfr Vigenère’a z tą różnicą, że my nie wykorzystamy ustalonego alfabetu ani tablicy polialfabetycznej gdyż dysponujemy tablicą ASCII którą możemy dowolnie przekształcać. Polega on na tym, że pierwszą literę klucza ustalamy a kolejnymi klucza będą kolejne litery tekstu jawnego.

tekst jawny:  Atakujemy rano

litera szyfrująca:  N   –   ASCII(78)

ASCII tekstu jawnego: 65,116,97,107,117,106,101,109,121,32,114,97,110,111

A(65) + N(78) = 143 Mod 127 =  16

t(116) + A(65) =181 Mod 127 = 54

a(97) + t(116) = 213 Mod 127 = 86

k(107) + a(97) =204 Mod 127 = 77

ASCII tekstu zaszyfrowanego: 16,54,86,77,97,96,80,83,103,26,19,84,80,94

tekst zaszyfrowany: 6VMa`PSgTP^

Algorytm szyfrujący:

Jeśli znamy algorytm szyfrujący, nie będzie dla komputera problemem sprawdzenie wszystkich 127 możliwości wyboru liter i odszukania słów kluczy.
Musimy wiedzieć, że po zaszyfrowaniu tekstu i wyświetleniu go na ekranie, często jest tak, że tekst z użytym kodowaniem ASCII może natrafić na taki znak, który po zaznaczeniu, skopiowaniu i zapisaniu może zostać zniekształcony, dlatego po zaszyfrowaniu należy utworzyć plik z zaszyfrowaną wiadomością, pozwoli to na zachowanie oryginalnego kodu bez zniekształceń:

Taki plik wczytamy za pośrednictwem kodu:

Efektem jest utworzenie pliku w podanej lokalizacji o ustalonej nazwie:

Drugie narzędzie daje nam możliwość odszyfrowania wiadomości:

Dzięki tym narzędziom możemy utworzyć proste oprogramowanie, dzięki któremu będziemy mogli z ustalonym kluczem tworzyć i odczytywać zaszyfrowane wiadomości powyższymi metodami. Szyfrować za pomocą tych prostych metod można nie tylko tekst ale również piksele. Piksel jest to najmniejszy jednolity (przedstawiający konkretny kolor) element obrazu wyświetlanego na ekranie. Jeśli użyjesz Painta do stworzenia obrazka zauważysz, że każdy kwadracik składa się z trzech kolorów, paleta ta nazywana jest RBG (red, blue, green) i przyjmują wartości od 0-255. Kolor czarny będzie miał reprezentacje RBG(0,0,0), biały(255,255,255), czerwony(255,0,0) itd. Istnieje możliwość dodania kanału Alfa ale nie będzie on omawiany w naszym eksperymencie. Aby edytować piksele obrazu, należy go najpierw pobrać do bufora, edytować jego piksele i nadpisać. Po przeczytaniu powyższej części każdy artykułu każdy z was powinien  powiedzieć pomyśleć, że to nic trudnego.Wystarczy przestawić wartości piksela o wartość klucza w prawo lub w lewo i kiedy mamy piksel RGB(243,254,53) przesunięcie w prawo o 3 (tak jak w przypadku szyfru cezara) załatwi sprawę:

RGB(243,254,53)—-> 3 —–>RGB(246,2,56), czy takie podstawienie ma sens? Czy przestawienie tych wartości o 30 lub o 167 ma sens? zobaczmy:

Kod użyty do przestawienia wartości pikseli : 

Jak widzicie nie dało to zadowalających efektów, nadal widać, że to kot. Szyfr z kluczem daje lepsze efekty ale jest w dużym stopniu zależny od jego długości :

Kod użyty do przestawienia wartości pikseli : 

Problem jeśli chodzi o klucz polega na tym, że litery użyte w kluczu zarówno krótkim jak i długim są stosunkowo blisko siebie a pikseli jest często bardzo dużo. Zmiana barwy piksela o małą wartość 3, 2 lub 4 w górę czy w dół jest dla ludzkiego oka dosłownie niezauważalna. Dlatego nasz kod należy zmienić tak aby zmiany wartości były bardzo duże.

Wplecenie do pętli indeksu rosnącego:

Przemnożenie wartości ASCII klucza przez 10:

Algorytm pobierający znaki(tekst) z pliku: 

Przykładowy kod deszyfrujący: 

Efekt przy użyciu klucza: kryptografiajestEkstra

Niestety ale gdy nasz obrazek jest mało szczegółowy:

Efekt może być niezadowalający, mimo iż powyższy obrazek jest zaszyfrowany, bardziej wygląda to jak znak wodny który mimo wszystko da się odczytać.

Jak więc używając szyfru podstawieniowego i przestawić piksele tak aby kotek był niewidoczny całkowicie. Aby użyć naszego szyfru na tym etapie, można zastosować stworzenie klucza automatycznie i zapisanie go oddzielnie w pliku, klucz taki może być obrazkiem lub listą przesunięć:

Lista przesunięć:

Przykład takiego algorytmu: 

Algorytm deszyfrujący: 

dla klucza w formacie graficznym algorytm wygląda podobnie:

Algorytm szyfrujący: 

Algorytm deszyfrujący:

Takie przestawianie pikseli jest bardzo efektywne, niestety klucz jest dość długi i duży. Również konieczność posiadania klucza przez obie strony powoduje problemy, im bardziej klucz jest rozpowszechniony tym większa jest szansa na jego zdobycie przez potencjalnego złodzieja, ponieważ bez klucza, druga strona nie jest w stanie, nawet przy użyciu najnowszej technologi odczytać obrazu. Wszystko w komputerze to liczby, obrazy, filmy, muzyka a przynajmniej z tego się składają. Jeśli tak można by było również przestawiać cyfry w filmie, muzyce, grafice itp. Każdy plik na komputerze składa się z 1 i 0 te łączą się w bajty. Jeden bajt składa się z 8 bitów. Bity można przedstawić w formie binarnej, może przechowywać wartość od 0 – 11111111 dla notacji dziesiętnej będzie to 0-255 a szesnastkowej 0-ff. Tak więc jeśli pobierzemy wszystkie bajty danego pliku i przestawimy je o 3 w prawo nasz plik będzie zaszyfrowany. Stworzyłem sobie, przy użyciu Painta plik graficzny bmp który składa się z czterech białych pikseli. Użyłem programu HxD do podejrzenia wnętrza tego pliku:

Plik składa się z nagłówka i danych, ale w tym artykule nie będziemy się zajmować tym z czego on się składa bo wszyscy widzą z czego, składa się z liczb (tutaj w systemie szesnastkowej). Wystarczy je przy użyciu odpowiedniego algorytmu pobrać, jeden po drugim i przestawić. Tak zmieniony plik jest nie do otworzenia, gdyż przed danymi znajduje się ważne informacje o pliku, jego strukturze, wymiarach, palecie barw, rodzaju kompresji itp, które są wymagane do otworzenia pliku.

Tak zmieniony plik jest nie do odczytania, nawet do otworzenia. Prosty algorytm szyfrujący bajty metodą podstawieniową:


Algorytm deszyfrujący:

Tak samo jak wcześniej, nic nie szkodzi na przeszkodzie użyć klucza lub autoklucza, trzeba pamiętać tylko, że bajty przyjmują wartości od 0-255 i uda wam się to bez problemu.

Permalink do tego artykułu: https://visualmonsters.cba.pl/kryptografia/szyfr-podstawieniowy-kluczem/

kryptoanaliza-proste szyfry podstawieniowe z wykorzystaniem vb.net i ASCII

 kryptoanaliza Kryptoanaliza statystyczna opierających się na fakcie nierównomiernego występowania poszczególnych liter i sylab w językach naturalnych. Jak wyglądałaby prosta kryptoanaliza tego typu szyfru. Tak jak wspominałem na początku, należy zliczyć ilość liter w naszym tekście. a ą b c ć d e 8,91% 0,99% 1,47% 3,96% 0,40% 3,25% 7,66% ę f g h i j …

wykorzystanie liczb pierwszych w prostych szyfrach podstawieniowych

Liczby pierwsze w prostych szyfrach podstawieniowych. Przykłady i wyjaśnienie działania.

Dodaj komentarz

Twój adres email nie będzie publikowany.