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:
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
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
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”:
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ą:
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”:
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”:
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:
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








