szyfr z kluczem

szyfr_z_kluczemProgram szyfrujący można pobrać tutaj: szyfr_z_kluczem_exe

Działa na Windows 7+

 

 

 

 

 

 

 

 

Szyfr cezara opisany tutaj można łatwo złamać. im dłuższa jest wiadomość tym łatwiej ją rozszyfrować. Wystarczy policzyć liczebność poszczególnych liter i sprawdzić jakie liczby w danym języku najczęściej występują.

700px-Polish_letters_frequencies.svg

 

jak widzimy w języku polskim najczęściej występującymi literami są „a”,”e”,”i”,”o” wystarczy,że namierzymy jakąś pojedyńczą literę i ją dopasujemy do układanki. Układ w Szyfru cezara wyglądał następująco:

a , b, c , d , e ,  f , g , h , i , j , ….      dla przesunięcia o 3 w prawo otrzymywaliśmy

x , y ,  z , a , b , c , d , e , f , g ….      nasze „a” zamieniało się w „d”, „d” zamieniało się w „g” i tak dalej.

Tak więc na dłuższą metę system ten się nie sprawdzał. im więcej mamy tekstu za hasłowanego tym łatwiej go złamać. Lepszą metodą jest szyfr z kluczem. Polega on także na przesuwaniu liter ale sekwencja ich przesuwania jest zakodowana w kluczu.

Ustawmy nasze słowo kluczowe na „suzuki”, sprawdzamy teraz w swoim alfabecie na jakich pozycjach stoją litery naszego słowa. U mnie było to „18 , 21 , 24 , 21 , 11 , 9”. nasz klucz będzie szyfrował pierwszą literę  przesuwając ją w prawo o 18 potem drugą przesuwając w prawo o 21 następną o 24 itd. zakodowanie wiadomości: „kocham kryptografie” przesunie nam nasze litery o:

KOCHAM KRYPTOGRAFIE

18,21,24,21,11,9 18,21,24,21,11,9,18,21,24,21,11,9

ELCELX ENYMFZANACWN

Fajne prawda. Tekst tak za hasłowany jest dużo trudniejszy do złamanie. Ale nie niemożliwy. Nasz program do szyfrowania będzie wyglądał tak:

szyfr z kluczem

 

Będzie on trochę bazował na kodzie z programu w tym dziale: „Szyfr Cezara” więc warto zapoznać się z jego budową. Układamy wszystkie elementy tak jak na obrazku powyżej. 8 TextBoxów w tym 5 z zaznaczonym MultiLine, i dwa przyciski „Button”. warto robić to na bazie programu opisanego we wcześniejszym poście „Szyfr Cezara”. zachowujemy obie funkcje i Enum:

    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

    Function zaszyfruj(ByVal litera As String, ByVal przesuniecie As Integer)
        If IsNumeric(litera) Then
            If litera + przesuniecie > 9 And litera + przesuniecie < 20 Then
                Return (litera + przesuniecie - 10).ToString
            ElseIf litera + przesuniecie > 19 And litera + przesuniecie < 30 Then
                Return (litera + przesuniecie - 20).ToString
            ElseIf litera + przesuniecie > 29 Then
                Return (litera + przesuniecie - 30).ToString
            Else
                Return (litera + przesuniecie).ToString
            End If
        Else
            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 If
    End Function

    Function rozszyfruj(ByVal litera As String, ByVal przesuniecie As Integer)
        If IsNumeric(litera) Then
            If litera - przesuniecie < 0 And litera - przesuniecie >= -10 Then
                Return (litera - przesuniecie + 10).ToString
            ElseIf litera - przesuniecie < -10 And litera - przesuniecie >= -20 Then
                Return (litera - przesuniecie + 20).ToString
            ElseIf litera - przesuniecie < -20 Then
                Return (litera - przesuniecie + 30).ToString
            Else
                Return (litera - przesuniecie).ToString
            End If
        Else
        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 If
    End Function

Sytuacja zmienia się trochę podczas przyciskania przycisku. wcześniej w naszej sentencji:

TextBox3.Text += zaszyfruj(elements, TrackBar1.Value).ToString

nasze przesunięcie było stałe o wartość jaką miał TrackBar1. My chcemy aby ta wartość była zmienna (zależna od klucza). Najpierw musimy wydobyć z klucza informacje nam potrzebne. W tym celu zainicjujemy sobie tablice która będzie przechowywała nam cyfry (integer) odpowiednio dopasowane do naszego Enum. kod poniżej pokazuje nam jak to osiągnąć:

  1. Inicjujemy tablice
  2. Wyodrębniamy litery z TextBox4 (klucza)
  3. Sprawdzamy czy istnieje powiązanie między kluczem a Enum. Jeśli tak do naszej tablicy „klucz” wstawiamy odpowiednią cyfrę przypisaną dla niej w Enum.
  4. Dodajemy wyodrębnioną cyfrę z Enum do naszej tablicy
  5. Wypisujemy nasz klucz w formie cyfrowym w TextBox5.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox3.Clear()
        Dim klucz As New List(Of Integer)
        For Each letter As String In TextBox4.Text
            For Each i As Integer In [Enum].GetValues(GetType(LetterType))
                If letter = CType(i, LetterType).ToString Then
                    klucz.Add(CType(i, LetterType))
                End If
            Next
        Next


        For Each listaKlucza As Integer In klucz
            TextBox5.Text += listaKlucza.ToString
        Next
    End Sub

Po odpaleniu wszystko powinno działać. Sprawdźcie sami czy to działa. U mnie wyglądało to tak:

szyfr z kluczem2

Teraz należy te liczby z tablicy wykorzystać do szyfrowania. Czyli tutaj:

TextBox3.Text += zaszyfruj(elements, 'czyfry z tablicy').ToString

Najpierw dodamy sobie zmienną która będzie nam badała położenie na jakim znajdujemy się w tablicy:

        Dim polozenieWKluczu As Integer = 0

Do elementów tablicy odwołujemy się w następujący sposób:

Dim klucz As New List(Of String) = {"ala", "gosia", "monika"}

klucz(0) 'kryje wartość tablicy 'ala'
klucz(1) 'kryje wartość 'gosia'

Tak więc aktualne przesunięcie litery będzie odbywało się poprzez połączenie „klucza” i „polozenieWKluczu”.

klucz(polozenieWKluczu) 'da nam wartość aktualnego przesunięcia

a zmianę przesunięcia będziemy kontrolować poprzez dodanie do naszego „polozenieWKluczu +=1”

Całość wygląda tak:

  Dim polozenieWKluczu As Integer = 0

        For Each elements As String In TextBox1.Text
            If elements = " " Then
                TextBox3.Text += " "
                TextBox6.Text += "_"
            Else
                If polozenieWKluczu > klucz.Count - 1 Then
                    TextBox3.Text += zaszyfruj(elements, klucz(0))
                    TextBox6.Text += klucz(0).ToString + "'"
                    polozenieWKluczu = 1
                Else
                    TextBox3.Text += zaszyfruj(elements, klucz(polozenieWKluczu))
                    TextBox6.Text += klucz(polozenieWKluczu).ToString + "'"
                    polozenieWKluczu += 1
                End If
            End If
        Next

nasza pętla „IF” mówi, że jeżeli położenie klucza będzie większe niż ilość zawartych w nim cyfr należy do naszej zaszyfrowanej wiadomości dodać literę z przesunięciem „klucz(0)” i zacząć liczyć nasze „polozenieWKluczu” od 1. jeśli polożenie w kluczu nie nie jest większe od jego liczebności użyj przesunięcia klucz(polozenieWKluczu) i zwiększ „polozenieWKluczu” o jeden. ostatecznie wygląda to tak:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox3.Clear()
        Dim klucz As New List(Of Integer)
        For Each letter As String In TextBox4.Text
            For Each i As Integer In [Enum].GetValues(GetType(LetterType))
                If letter = CType(i, LetterType).ToString Then
                    klucz.Add(CType(i, LetterType))
                End If
            Next
        Next

        For Each listaKlucza As Integer In klucz
            TextBox5.Text += listaKlucza.ToString + ","
        Next

        Dim polozenieWKluczu As Integer = 0

        For Each elements As String In TextBox1.Text
            If elements = " " Then
                TextBox3.Text += " "
                TextBox6.Text += "_"
            Else
                If polozenieWKluczu > klucz.Count - 1 Then
                    TextBox3.Text += zaszyfruj(elements, klucz(0))
                    TextBox6.Text += klucz(0).ToString + "'"
                    polozenieWKluczu = 1
                Else
                    TextBox3.Text += zaszyfruj(elements, klucz(polozenieWKluczu))
                    TextBox6.Text += klucz(polozenieWKluczu).ToString + "'"
                    polozenieWKluczu += 1
                End If
            End If
        Next
    End Sub

 

Kod do deszyfrowania jest analogiczny.

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        TextBox2.Clear()

        Dim klucz As New List(Of Integer)

        For Each letter As String In TextBox4.Text
            For Each i As Integer In [Enum].GetValues(GetType(LetterType))
                If letter = CType(i, LetterType).ToString Then
                    klucz.Add(CType(i, LetterType))
                End If
            Next
        Next

        For Each listaKlucza As Integer In klucz
            TextBox7.Text += listaKlucza.ToString + ","
        Next

        Dim polozenieWKluczu As Integer = 0
        For Each elements As String In TextBox3.Text
            If elements = " " Then
                TextBox2.Text += " "
                TextBox8.Text += "_"
            Else
                If polozenieWKluczu > klucz.Count - 1 Then
                    TextBox2.Text += rozszyfruj(elements, klucz(0))
                    TextBox8.Text += klucz(0).ToString + "'"
                    polozenieWKluczu = 1
                Else
                    TextBox2.Text += rozszyfruj(elements, klucz(polozenieWKluczu))
                    TextBox8.Text += klucz(polozenieWKluczu).ToString + "'"
                    polozenieWKluczu += 1
                End If
            End If
        Next

    End Sub

wygląda to tak:

a pełen kod pobieramy: szyfr_z_kluczem_poprawiony

obrazek pobrany ze strony: http://pl.wikipedia.org/wiki/Alfabet_polski

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

Dodaj komentarz

Twój adres email nie będzie publikowany.