Szyfr Cezara

Jest to jedna z najprostszych technik szyfrowania. Jest to rodzaj szyfrowania podstawionego, w którym każda litera tekstu jawnego (niezaszyfrowanego) zastępowana jest oddaloną od niej o stałą liczbę pozycji w alfabecie inną literą, przy czym kierunek zmiany musi być zachowany. Nazwa szyfru pochodzi od Juliusza Cezara. Bardzo fajna sprawa, jeśli czytelnik wie o co chodzi może przejść dalej, jeśli jeszcze nie wiecie jak to wygląda zapraszam do lektury na Wikipedię.

http://pl.wikipedia.org/wiki/Szyfr_Cezara

Zaczynamy standardowo od nowego projektu. Rozstawiamy trzy „TextBoxy” w formie „MultiLine” i dwa przyciski jeden do szyfrowania, drugi do deszyfrowania. Wstawiamy Track bar a pod nim literki(Label z odpowiednimi literami), ja dodałem jeszcze label z tekstem „Przesunięcie w prawo o +” i dodatkowy label który będzie pokazywał wartość TrackBaru o wartości od 0 do 23. U mnie wyglądało to tak:

szyfr_cezara_1

 

Zrobimy teraz tak. Przejdziemy do kodu i zadeklarujemy sobie wyliczenie i określimy sobie wartość ich członków:

 Public Enum LetterType

        a = 1
        b = 2
        c = 3
        d = 4
        e = 5
        f = 6
        g = 7
        h = 8
        i = 9
        j = 10
        k = 11
        l = 12
        m = 13
        n = 14
        o = 15
        p = 16
        r = 17
        s = 18
        t = 19
        w = 20
        u = 21
        x = 22
        y = 23
        z = 24

    End Enum

Do każdej literki przypisujemy odpowiedni numer. Jeśli uważacie, że pominąłem jakąś literkę i chcecie dodać „ł” czy „ś” nie krępujcie się. Pamiętajcie tylko, że wtedy trzeba track bar powiększyć i późniejsze operacje troszeczkę zmienić bo tych liter będzie więcej albo mniej jak tam chcecie. Teraz przyciskamy przycisk „szyfrowania” i tworzymy uchwyt przycisku. W tym uchwycie wpisujemy

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox3.Clear() ''czyści textbox3
        For Each elements As String In TextBox1.Text
            If elements = " " Then
                TextBox3.Text += " "
            Else
                TextBox3.Text += zaszyfruj(elements, TrackBar1.Value).ToString
            End If

        Next
    End Sub

Wygląda to tak, że nasza pętla „if” sprawdzi każdą literkę z pierwszego TextBoxu w którym wpiszemy naszą niezaszyfrowaną wiadomość i przypisze jej odpowiednio:

  • Jeśli w tekście wystąpi spacja czyli ” ” powinniśmy zostawić spacje i przepisać ją do TextBox3 aby składnia tekstu została zachowana.
  • jeśli w naszym tekście wystąpi litera Funkcja „zaszyfruj” zamieni nam ją na odpowiednio przesuniętą literę. (element- nasza litera z niezaszyfrowanej wiadomości, trackBar1.value – wartość przesunięcia)

Teraz stworzymy Funkcję która będzie nam podmieniać literki. Wygląda ona tak:

  Function zaszyfruj(ByVal litera As String, ByVal przesuniecie As Integer)
        For Each i As Integer In [Enum].GetValues(GetType(LetterType))
            If litera = CType(i, LetterType).ToString Then
                If i + przesuniecie > 24 Then
                    Return CType(i + przesuniecie - 24, LetterType).ToString
                Else
                    Return CType(i + przesuniecie, LetterType).ToString
                End If
            End If
        Next
    End Function

Nasza funkcja sprawdzi każdą literę z naszego Enum jeśli „if” dojdzie do zdarzenia ,że litera pobrana z pętli inicjatora funkcji będzie identyczna jak ta z Enum  zwróci nam odpowiednio przesuniętą literę. („return”) Tutaj mamy taką sytuacje, że nasza litera może wyjść poza zakres naszego Enum. Trzeba coś zrobić aby temu przeciwdziałać i jednocześnie zaczynać liczenie od nowa. Przykładem takiej sytuacji jest przesunięcie większe niż połowa liczebności naszego zbioru Enum. Jeśli litere s która jest na pozycji 18 będziemy chcieli przesunąć o 10 to oczywiście suma takiego przesunięcia będzie 28 co wykracza poza zakres Enum w którym mamy tylko 24 pozycje. należy od tego 28 odjąć 24 co spowoduje,że pozycja naszej litery będzie równała się 4 czyli „d” a więc przesunięcie będzie zachowane. jeśli nie wprowadzimy tutaj pętli jak w przepisie wtedy nasze litery mogą wykraczać poza zakres co spowoduje wystąpieniem błędu.

Jeśli z Enum chcemy wydobyć informacje na jakiej pozycji stoi nasza litera albo jaką dana litera ma pozycja możemy użyć odwołania:

TextBox2.Text = LetterType.a ”zwróci nam wartość 1
TextBox2.Text = LetterType.a.ToString ”zwróci nam warość „a”
CType(1, LetterType) ”zwróci nam wartość 1
CType(1, LetterType).ToString ”zwróci nam wartość „a”

Teraz możemy sprawdzić nasz program:

szyfr_cezara_2

Po głębszym przeanalizowaniu naszych metod użytych w Uchwycie przycisku i funkcji na pewno każdy z was będzie mógł bez trudu zrobić metody deszyfrujące. Ale dla leniwych dołączam je tutaj:

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        TextBox2.Clear()
        For Each elements As String In TextBox3.Text
            If elements = " " Then
                TextBox2.Text += " "
            Else
                TextBox2.Text += rozszyfruj(elements, TrackBar1.Value).ToString
            End If

        Next
    End Sub

    Function rozszyfruj(ByVal litera As String, ByVal przesuniecie As Integer)
        For Each i As Integer In [Enum].GetValues(GetType(LetterType))
            If litera = CType(i, LetterType).ToString Then
                If i - przesuniecie < 0 Then
                    Return CType(i - przesuniecie + 24, LetterType).ToString
                Else
                    Return CType(i - przesuniecie, LetterType).ToString
                End If

            End If
        Next
    End Function

i oczywiście kod do tego dodatkowego labelu tóry pokazuje wartość przesunięcia:

    Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
        Label25.Text = TrackBar1.Value

    End Sub

Gotowy program/kod pobieramy tutaj :szyfr_cezara

Filmik prezentujący jak to działa zobaczymy tutaj:

Permalink do tego artykułu: https://visualmonsters.cba.pl/szyfr-cezara/

Dodaj komentarz

Twój adres email nie będzie publikowany.