Szyfrowanie za pomocą zmiany numeru znaku, zmiana losowa.

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:

asc1

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.

asc2

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:

asc3

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ć:

asc4

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:

asc5

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)

asc6Dodajemy dwa przyciski: Otwórz i Zapisz

asc7

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:

asc8

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:

ascMam 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

 

 

 

 

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/szyfrowanie-za-pomoca-zmiany-numeru-znaku-zmiana-losowa/

Dodaj komentarz

Twój adres email nie będzie publikowany.