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.

algorytm szyfr Cezara Visual studio C#

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.

aplikacja szyfru Cezara, Visual studio C#

Komponenty użyte w tworzonej aplikacji desktopowej pokazuje poniższa ilustracja

algorytm szyfr Cezara aplikacja desktopowa Visual studio C#

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));
        }
    }
}
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz