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:
Zrobimy teraz tak. Przejdziemy do kodu i zadeklarujemy sobie wyliczenie i określimy sobie wartość ich członków:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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
1 2 3 4 5 6 7 8 9 10 11 |
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:
1 2 3 4 5 6 7 8 9 10 11 |
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:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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:
1 2 3 4 |
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: