Szyfr Cezara
Szyfr Cezara należy do grupy szyfrów podstawieniowych. Szyfrowanie podstawieniowe polega na wykorzystaniu przesunięcia znaków według zadanego klucza w obrębie używanego alfabetu. W przypadku gdy będą to znaki z końca alfabetu, należy uwzględnić przesunięcie w taki sposób aby przejść do znaków z początku alfabetu.
Dla przykładu słowo KOT zaszyfrowane kluczem o wartości 3 jest zapisane jako: NRW
Odszyfrowanie zakodowanego tekstu wymaga znajomości wartości przesunięcia znaków, czyli klucza. Odkodowanie wiadomości jest procesem odwrotnym, znaki należy przesunąć w lewo o wartość podanego klucza szyfrowania.
Algorytm szyfrowania podstawieniowego- szyfr Cezara
Podstawą niniejszego algorytmu jest zbiór kodów ASCII dla znaków wprowadzanych z klawiatury. Zbiór ten zawiera 256 elementów indeksowanych od 0 do 255. Kod znaku A to 65, a znaku Z to 90. Dla małych liter jest podobnie, kod znaku a to 97, a znaku z to 122.
Przy szyfrowaniu i deszyfrowaniu wykorzystamy typ znakowy char. Używając konstrukcji (char)65 będziemy mieć dostęp do znaku A, (char)66 da nam znak B itd.
Cel ćwiczenia
Napisz aplikację, która zwróci kody znaków ASCII, zaszyfruje i odszyfruje tekst przy użyciu szyfru Cezara.
Komponenty użyte w tworzonej aplikacji desktopowej pokazuje poniższa ilustracja
Kod funkcji pokazującej kody znaków ASCII
W zdarzeniu Click kontrolki Button wprowadź poniższy kod
Wskazówka:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Clear();
for (int i=0;i<256;i++)
textBox1.AppendText(i.ToString()+" " + (char)i + Environment.NewLine);
}
Skompiluj program i sprawdź efekt działania.
Funkcja szyfrująca
Piszemy funkcję szyfrującą, która będzie zwracać zaszyfrowany tekst- łańcuch znaków typu string. Funkcja ta będzie dwuargumentowa. Pierwszym argumentem jest tekst źródłowy podany w postaci łańcucha znaków (typ string). Drugi argument jest wartością klucza szyfrującego (typ int)
Wskazówka:
string Szyfruj(string txt,int klucz)
{
string wynik = "";
for(int i = 0;i< txt.Length; i++)
{
//nie szyfruj spacji i przecinka
if(txt[i] !=' ' && txt[i]!=',')
{
//szyfruj duze litery
if (txt[i] >= 'A' && txt[i]<='Z')
wynik = wynik + (char)(65 + (txt[i] - (65 - klucz)) % 26);
//szyfruj male litery
if (txt[i] >= 'a' && txt[i] <= 'z')
wynik = wynik + (char)(97 + (txt[i] - (97 - klucz)) % 26);
}
//skopiju spację, przecinek bo nie są szyfrowane
else wynik+=txt[i];
}
return wynik;
}
Funkcję wywołamy w zdarzeniu Click kolejnej kontrolki typu Button
Wskazówka:
private void button2_Click(object sender, EventArgs e)
{
//wyskocz jak nie podano klucza
if (textBox4.Text.Length < 1) return;
textBox3.Clear();
int klucz = Convert.ToInt16(textBox4.Text);
//pokaz zaszyfrowany tekst
textBox3.AppendText(Szyfruj(textBox2.Text,klucz));
}
Skompiluj program i sprawdź efekt działania.
Funkcja deszyfrująca
Funkcja deszyfrująca swym działaniem jest odwrotna do działania funkcji szyfrującej. Napiszemy ja na tych samych zasadach. Różnica jest w sposobie uzyskania przesunięcia dla małych liter. Co wiąże się z metodą obliczenia indeksu znaku z wykorzystaniem reszty z dzielenia z połączeniem uniwersalności dla kluczy większych niż wartość ilości znaków w używanym alfabecie łacińskim bez polskich znaków (tu 26 sztuk)
Wskazówka:
string Deszyfruj(string txt, int klucz)
{
string wynik = "";
for (int i = 0; i < txt.Length; i++)
{
//nie uwzględniaj spacji i przecinka
if (txt[i] != ' ' && txt[i] != ',')
{
//deszyfruj duze litery
if (txt[i] >= 'A' && txt[i] <= 'Z')
wynik = wynik + (char)(65 + (txt[i] + (65 - klucz)) % 26);
//szyfruj male litery
if (txt[i] >= 'a' && txt[i] <= 'z')
wynik = wynik + (char)(97 + (txt[i] + (85 - klucz)) % 26);
}
//skopiju spację, przecinek bo nie są szyfrowana
else wynik += txt[i];
}
return wynik;
}
Funkcję wywołamy w zdarzeniu Click kolejnej kontrolki typu Button
Wskazówka:
private void button3_Click(object sender, EventArgs e)
{
//wyskocz jak nie podano klucza
if (textBox4.Text.Length < 1) return;
textBox3.Clear();
int klucz = Convert.ToInt16(textBox4.Text);
//pokaz odszyfrowany tekst
textBox3.AppendText(Deszyfruj(textBox2.Text, klucz));
}
Skompiluj program i sprawdź efekt działania.
Pełny kod pliku Form1.cs utworzonej aplikacji desktopowej
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace _26AlgSzyfrCezara
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string Szyfruj(string txt,int klucz)
{
string wynik = "";
for(int i = 0;i< txt.Length; i++)
{
//nie szyfruj spacji i przecinka
if(txt[i] !=' ' && txt[i]!=',')
{
//szyfruj duze litery
if (txt[i] >= 'A' && txt[i]<='Z')
wynik = wynik + (char)(65 + (txt[i] - (65 - klucz)) % 26);
//szyfruj male litery
if (txt[i] >= 'a' && txt[i] <= 'z')
wynik = wynik + (char)(97 + (txt[i] - (97 - klucz)) % 26);
}
//skopiju spację, przecine bo nie są szyfrowane
else wynik+=txt[i];
}
return wynik;
}
string Deszyfruj(string txt, int klucz)
{
string wynik = "";
for (int i = 0; i < txt.Length; i++)
{
//nie uwzględniaj spacji i przecinka
if (txt[i] != ' ' && txt[i] != ',')
{
//deszyfruj duze litery
if (txt[i] >= 'A' && txt[i] <= 'Z')
wynik = wynik + (char)(65 + (txt[i] + (65 - klucz)) % 26);
//szyfruj male litery
if (txt[i] >= 'a' && txt[i] <= 'z')
wynik = wynik + (char)(97 + (txt[i] + (85 - klucz)) % 26);
}
//skopiju spację, przecinek bo nie są szyfrowana
else wynik += txt[i];
}
return wynik;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Clear();
for (int i=0;i<256;i++)
textBox1.AppendText(i.ToString()+" " + (char)i + Environment.NewLine);
}
private void button2_Click(object sender, EventArgs e)
{
//wyskocz jak nie podano klucza
if (textBox4.Text.Length < 1) return;
textBox3.Clear();
int klucz = Convert.ToInt16(textBox4.Text);
//pokaz zaszyfrowany tekst
textBox3.AppendText(Szyfruj(textBox2.Text,klucz));
}
private void textBox4_KeyPress(object sender, KeyPressEventArgs e)
{
//tylko cyfry
if (e.KeyChar == 8) return;//wyskocz jak BackSpace
if(e.KeyChar<'0'||e.KeyChar>'9') e.Handled = true;
}
private void button3_Click(object sender, EventArgs e)
{
//wyskocz jak nie podano klucza
if (textBox4.Text.Length < 1) return;
textBox3.Clear();
int klucz = Convert.ToInt16(textBox4.Text);
//pokaz odszyfrowany tekst
textBox3.AppendText(Deszyfruj(textBox2.Text, klucz));
}
}
}