W przykładzie tym posłużymy się funkcją: ASC zwraca ona wartość całkowitą reprezentującą znakowy kod. Aby przybliżyć wam tą myśl należy zrobić sobie pewien przykład. Każdy znak w komputerze ma swoją wartość w tabeli znaków:
1 2 3 4 5 |
TextBox1.Text = Asc("a") ''zwróci wartość 97 TextBox2.Text = Asc("b") ''zwróci wartość 98 TextBox3.Text = Asc("c") ''zwróci wartość 99 TextBox4.Text = Asc("6") ''zwróci wartość 54 TextBox5.Text = Asc("ó") ''zwróci wartość 243 |
Mając wartość całkowitą znaku możemy ją zmieniać. i tak jeśli chcielibyśmy zmienić prosty tekst „Ala” na reprezentacje ASC naszego napisu będzie on wyglądał następująco:
ala = 97, 108 , 97
Jeśli ktoś pamięta szyfr Cezara pamięta również, że polegał on na przesunięciu liter alfabetu o daną liczbę w prawo albo w lewo. Tak więc jak przesuniemy nasze wartości o 4 w prawo otrzymamy
ala = 97, 108 , 97 || +4 = 101, 112, 101 = epe || -4 = ala
1 2 3 4 5 6 |
TextBox1.Text = Asc("a") ''zwróci wartość 97 TextBox2.Text = Asc("l") ''zwróci wartość 108 TextBox3.Text = Asc("a") ''zwróci wartość 97 TextBox4.Text = Chr("101") ''zwróci wartość e TextBox5.Text = Chr("112") ''zwróci wartość p TextBox6.Text = Chr("101") ''zwróci wartość e |
Jeśli jesteście zainteresowani jakie znaki kryją się pod niektórymi wartościami całkowitymi zapraszam na wikipedie: http://pl.wikipedia.org/wiki/ASCII
Znaków w naszej tabeli znakowej ASCII jest 255 więc nie aż tak dużo jak się można było spodziewać. Niestety kod w którym dodajemy/odejmujemy jakąś wartośc jest dość prosty do złamania a kod w którym przesuwamy wartości za pomocą klucza już był i po skończeniu tego tutoriala i poprzedniego o szyfrowaniu za pomocą klucza każdy dobrze zorientowany programista da sobie rade zrobić taki program bo będzie wiedział jak one działają. Zastosujemy sobie szyfr podstawieniowy czyli za jakiś znak podstawimy sobie inny znak, wielkim minusem tej metody jest klucz publiczny który będziemy musieli generować co wiązać się może z jego przechwyceniem przez osobę trzecią. Ilustruje to obrazek poniżej:
Wygląda to tak: Osoba A szyfruje wiadomość, używając szyfru podstawieniowego, czyli za każdy rodzaj znaków w wiadomości podstawi inny znak. Czyli za wszystkie „a” podstawi „g”, za „b” podstawi „t” itd. Niestety do odczytania takiej zaszyfrowanej wiadomości musi utworzyć instrukcje (klucz) za pomocą której osoba B odczyta taką wiadomość. W przypadku kodu z kluczem użytkownik A mógł bez przeszkód zadzwonić do B i powiedzieć mu przez telefon klucz albo powiedzieć mu klucz gdy się spotkają. Niestety w tym wypadku instrukcja może być za długa lub znaki mogą być zbyt skomplikowane/długa aby je zapamiętać, również generowanie jednego klucza dla wszystkich wiadomości może być niebezpieczne. Dlatego dla każdej wiadomości musi być generowany oddzielny klucz co zwiększa bezpieczeństwo. Osoba trzecia C aby odczytać wiadomość musi przechwycić wiadomość i klucz w innym wypadku nie odczyta wiadomości, niestety osoba B aby odczytać wiadomość musi również dostać klucz.
Aby utworzyć taki klucz posłużymy się tabelą. Podobnie jak podczas losowania liczb bez powtórzeń: https://visualmonsters.cba.pl/index.php/losowanie-bez-powtorzen-lotto/
Jak pamiętamy w ASCII mamy tylko 255 znaków więc należy utworzyć tabelę o wielkości 255. Następnie na na numerze naszego znaku zaszyfrowanego np a ma numer w ASCII równy 97 tak więc na naszej komórce 97 wpiszemy sobie nasz znak szyfrujący.
Program najpierw generuje numer całkowity znaku w ASCII ( a=97) następnie do numeru w tabeli o numerze ASCII dla znaku wpisuje znak podstawieniowy.
Dobra wiemy jak to zrobimy więc do dzieła. Robimy nowy projekt, dodajemy dwa Textboxy z opcją „Multiline” i jeden przycisk:
Przechodzimy do kodu naszego programu. Najpierw inicjujemy tabele o rozmiarze 255
1 2 |
Public Class Form1 Dim Klucz(255) As Char |
W pierwszym textboxie będziemy wpisywać tekst następnie tekst zaszyfrowany pojawi nam się w textboxie 2-gim. Aby tego dokonać tworzymy sobie uchwyt do przycisku „Szyfruj”:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Szyfruj.Click Dim tekst As String = "" For i = 0 To Wiadomosc.Text.Length - 1 ''wybieramy kolejno pojedyńcze znaki z wiadomości If Asc(Wiadomosc.Text(i)) > 126 Or Asc(Wiadomosc.Text(i)) < 32 Then ''ograniczamy znaki naszej wiadomości tekst &= Szyfrowanie(" ") 'stosujemy funkcje szyfrującą "Szyfrowanie" Else tekst &= Szyfrowanie(Wiadomosc.Text(i)) 'stosujemy funkcje szyfrującą "Szyfrowanie" End If Next Zaszyfrowana_wiadomosc.Text = tekst ''wyświetlamy zaszysfrowaną wiadomość End Sub |
Teraz Stworzymy sobie funkcję szyfrującą:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Private Function Szyfrowanie(ByVal pobrany_znak As Char) As Char Dim znak As Char If Klucz(Asc(pobrany_znak)) = Nothing Then ''jeśli w tabeli nie ma znaku zamiennego na miejscu pobranego numeru Randomize() Do znak = Chr(CInt(255 * Rnd())) 'znak zamienny = znak o numerze 255 * <0,1> Loop Until InStr(CStr(Klucz), znak) = 0 Klucz(Asc(pobrany_znak)) = znak ' numer w tabeli o pobranym znaku = nasz znak podmienny Return znak 'zwraca znak Else Return Klucz(Asc(pobrany_znak)) 'jeśli znak na numerze już istnieje pobrany znak zostanie zastąpiony tym znakiem End If End Function |
Powinno działać:
Chyba dosyć dobrze zaszyfrowany. Aby to wam lepiej przedstawić do naszego projektu dodałem Listbox w którym wypisałem wszystkie elementy naszej tabeli Klucz:
Teraz musimy dodać możliwość zapisywania (wiadomości i klucza) i wczytywania aby to zrobić dodajemy do naszej formy z przybornika:
– Open file dialog (Otworz)
– Save file dialog (Zapisz)
Dodajemy dwa przyciski: Otwórz i Zapisz
Teraz tworzymy uchwyty dla naszych przycisków i kolejno dla przycisku „Otwórz”:
1 2 3 4 5 6 7 8 9 10 11 |
Dim NazwaKlucza As String ' publiczna nazwa klucza Private Sub Otworz_przycisk_Click(sender As Object, e As EventArgs) Handles Otworz_przycisk.Click Otworz.Filter = "Zaszyfrowana wiadomosc|*.enc" If Otworz.ShowDialog = DialogResult.OK Then ' jeśli uda się odczytać plik Zaszyfrowana_wiadomosc.Text = My.Computer.FileSystem.ReadAllText(Otworz.FileName) ' wpisuje zaszyfrowaną wiadomość do textboxa Wiadomosc.Clear() ' czyści textbox z wiadomością NazwaKlucza = Mid(Otworz.FileName, 1, Len(Otworz.FileName) - 4) & ".key" ' szuka klucza w pobliżu pliku Klucz = My.Computer.FileSystem.ReadAllText(NazwaKlucza) ' załaduj tablice z kluczem End If End Sub |
Dla przycisku „Zapisz”:
1 2 3 4 5 6 7 8 |
Private Sub Zapisz_Przycisk_Click(sender As Object, e As EventArgs) Handles Zapisz_Przycisk.Click Zapisz.Filter = "Zaszyfrowana wiadomosc|*.enc" If Zapisz.ShowDialog = DialogResult.OK Then My.Computer.FileSystem.WriteAllText(Zapisz.FileName, Zaszyfrowana_wiadomosc.Text, False) 'zapisuje takst zaszyfrowany do pliku NazwaKlucza = Mid(Zapisz.FileName, 1, Len(Zapisz.FileName) - 4) & ".key" 'tworzy nazwę klucza My.Computer.FileSystem.WriteAllText(NazwaKlucza, Klucz, False) ' zapisuje klucz do pliku End If End Sub |
U mnie wszystko działało więc i u was powinno. Teraz dodamy przycisk do rozszyfrowania naszej wiadomości:
i jego zdarzenie:
1 2 3 4 5 |
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Rozszyfruj.Click For i = 0 To Zaszyfrowana_wiadomosc.Text.Length - 1 Wiadomosc.Text &= Chr(InStr(Klucz, Zaszyfrowana_wiadomosc.Text(i)) - 1) Next End Sub |
Wszystko powinno działać bez problemu. Teraz wystarczy dodać małą funkcjonalność dla naszego programu, czyli:
– Jeśli użytkownik przyciśnie „Otwórz” czyść textbox: Wiadomość.
– Jeśli użytkownik zacznie wpisywać wiadomość czyść textbox: Zaszyfrowana wiadomość .
– Zapisz: czyść wszystko.
– Przycisk do resetowania ustawień.
Po przeróbce mój program wygląda tak:
Mam nadziej, że załapaliście i wiecie jak przerobić je na hasło klucz. Taki jak w tym tutorialu: https://visualmonsters.cba.pl/index.php/szyfr-z-kluczem/ Jeśli będziecie mieli problem warto niedługo tutaj zajrzeć a opublikuje taki przykład. Standardowo do pobrania cały projekt tutaj: Szyfr_podstawieniowy_ASCII