Sunteți pe pagina 1din 6

Metode matematice de criptare i securitate a datelor

LABORATOR 5
Sistemul de criptare Polybios

Sistemul de criptare Polybios este un sistem monoalfabetic, care foloseste o matrice pentru
criptarea caracterelor.
S considerm alfabetul latin din care eliminm o liter cu frecven ct mai redus: fie
aceasta W. Cele 25 de litere rmase le aezm ntr-un ptrat 5 x 5 (numit careu Polybios), de
exemplu:

n operaia de criptare, fiecare caracter a va fi reprezentat printr-o pereche (x,y) (


x, y { A, B, C , D, E} ) care dau linia respectiv coloana pe care se afl a.
Astfel, conform matricei de mai sus, textul clar MERGEM ACASA este criptat n
CCAEDCBBAECCAAACAADDAA.
Vom dezvolta n continuare proiectul Criptare creat n primul laborator. Pentru preluarea
matricei de criptare i a caracterelor care vor fi folosite pentru criptare, este nevoie de o nou
fereastr care s conin datele referitoare la cheie. Clasa care va gestiona aceast fereastr se
numete Polybios.

Metode matematice de criptare i securitate a datelor


Aceast

fereastr

coine

urmtoarele

controale:

dou

controale

de

grupare

(groupBoxMatrice, groupBoxCaractere), 35controale de tip textBox (textBox1, textBox2,


,textBox25, textBoxLin1, , textBoxLin5, textBoxCol1, , textBoxCol5) i dou butoane
(buttonCript i buttonCancel).
Controlul buttonCrip are setat proprietatea DialogResult pe valoarea OK, iar controlul
buttonCancel are setat proprietatea DialogResult pe valoarea Cancel. Valoarea ntoars de
aceast proprietate este folosit de algoritmul de criptare pentru a decide dac efectueaz sau nu
criptarea textului clar.
Cele 26 de controale de tip TextBox au setat proprietatea CharacterCasing pe valoarea
Upper.
n clasa DateCezar, clas existent n proiect, sunt adugate trei atribute pentru a memora
matricea de caractere i caracterele care vor fi folosite pentru criptare, att pe linie ct i pe coloan.
//pentru sistemul Polybios
public static char [,] mat=new char [5,5];
public static char[] linie = new char[5];
public static char[] coloana = new char[5];

Pentru a cuta poziia unui caracter n matrice, n clasa DateCezar este construit o funcie
static care primete trei parametrii: caracterul pentru care se dorete aflarea poziiei i linia i
coloana pe care acesta se afl. Funcia returneaz 1 dac caracterul a fost gsit i 0 dac acesta nu se
afl n matrice
public static int findPolybios(char ch, out int lin,out int col)
{
lin = -1;
col = -1;
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
if (mat[i, j] == ch)
{
lin = i;
col = j;
return 1;
}
return 0;
}

n clasa Polybios, construim o fucie care verific dac un caracter se afl n matrice, fr a
returna ns i poziia acestuia. Acest funcie este folosit pentru a verifica numrul de caractere
distincte introduse n matricea de criptare.
int gasit(char ch)
{
//cautam caracterul in matrice
for (int i = 0; i <= 4; i++)
for (int j = 0; j <= 4; j++)

Metode matematice de criptare i securitate a datelor

if (DateCezar.mat[i,j] == ch)
return 1;
return 0;

Evenimentele click ale celor dou butoane de comand nchid fereastra curent i determin
ntoarcerea n fereastra principal a proiectului. Butonul de criptare actualizeaz matricea folosit la
criptare, copiaz n vectorii linie i coloana din clasa DateCezar caracterele folosite la criptare iar
n final verific dac au fost introduse n matrice 25 de caractere distincte.
private void buttonCript_Click(object sender, EventArgs e)
{
//copiem in matrice datele introduse de utilizator
DateCezar.mat[0, 0] = Convert.ToChar(textBox1.Text);
DateCezar.mat[0, 1] = Convert.ToChar(textBox2.Text);
DateCezar.mat[0, 2] = Convert.ToChar(textBox3.Text);
DateCezar.mat[0, 3] = Convert.ToChar(textBox4.Text);
DateCezar.mat[0, 4] = Convert.ToChar(textBox5.Text);
DateCezar.mat[1, 0] = Convert.ToChar(textBox6.Text);
DateCezar.mat[1, 1] = Convert.ToChar(textBox7.Text);
DateCezar.mat[1, 2] = Convert.ToChar(textBox8.Text);
DateCezar.mat[1, 3] = Convert.ToChar(textBox9.Text);
DateCezar.mat[1, 4] = Convert.ToChar(textBox10.Text);
DateCezar.mat[2, 0] = Convert.ToChar(textBox11.Text);
DateCezar.mat[2, 1] = Convert.ToChar(textBox12.Text);
DateCezar.mat[2, 2] = Convert.ToChar(textBox13.Text);
DateCezar.mat[2, 3] = Convert.ToChar(textBox14.Text);
DateCezar.mat[2, 4] = Convert.ToChar(textBox15.Text);
DateCezar.mat[3, 0] = Convert.ToChar(textBox16.Text);
DateCezar.mat[3, 1] = Convert.ToChar(textBox17.Text);
DateCezar.mat[3, 2] = Convert.ToChar(textBox18.Text);
DateCezar.mat[3, 3] = Convert.ToChar(textBox19.Text);
DateCezar.mat[3, 4] = Convert.ToChar(textBox20.Text);
DateCezar.mat[4, 0] = Convert.ToChar(textBox21.Text);
DateCezar.mat[4, 1] = Convert.ToChar(textBox22.Text);
DateCezar.mat[4, 2] = Convert.ToChar(textBox23.Text);
DateCezar.mat[4, 3] = Convert.ToChar(textBox24.Text);
DateCezar.mat[4, 4] = Convert.ToChar(textBox25.Text);
//copiem in vectori caracterele folosite pentru criptare
DateCezar.linie[0] = Convert.ToChar(textBoxLin1.Text);
DateCezar.linie[1] = Convert.ToChar(textBoxLin2.Text);
DateCezar.linie[2] = Convert.ToChar(textBoxLin3.Text);
DateCezar.linie[3] = Convert.ToChar(textBoxLin4.Text);
DateCezar.linie[4] = Convert.ToChar(textBoxLin5.Text);
DateCezar.coloana[0] = Convert.ToChar(textBoxCol1.Text);
DateCezar.coloana[1] = Convert.ToChar(textBoxCol2.Text);
DateCezar.coloana[2] = Convert.ToChar(textBoxCol3.Text);
DateCezar.coloana[3] = Convert.ToChar(textBoxCol4.Text);
DateCezar.coloana[4] = Convert.ToChar(textBoxCol5.Text);
//Verificam daca in matrice sunt 25 caractere distincte
int nr = 0;
for (char k = 'A'; k <= 'Z'; k++)
{
if (gasit(k) == 1)
nr++;
}

Metode matematice de criptare i securitate a datelor

if (nr != 25)
MessageBox.Show("Exista valori duplicat in matrice. Reintroduceti
matricea!");
else
this.Close();

private void buttonCancel_Click(object sender, EventArgs e)


{
this.Close();
}

Tratm evenimentul Load al ferestrei principale. Acesta iniializeaz textboxurile matricei i


ai vectorile n care se salveaz elementele folosite la criptare.
private void Polybios_Load(object sender, EventArgs e)
{
//initializam textboxurile
textBox1.Text = "A";
textBox2.Text = "B";
textBox3.Text = "C";
textBox4.Text = "D";
textBox5.Text = "E";
textBox6.Text = "F";
textBox7.Text = "G";
textBox8.Text = "H";
textBox9.Text = "I";
textBox10.Text = "J";
textBox11.Text = "K";
textBox12.Text = "L";
textBox13.Text = "M";
textBox14.Text = "N";
textBox15.Text = "O";
textBox16.Text = "P";
textBox17.Text = "Q";
textBox18.Text = "R";
textBox19.Text = "S";
textBox20.Text = "T";
textBox21.Text = "U";
textBox22.Text = "V";
textBox23.Text = "X";
textBox24.Text = "Y";
textBox25.Text = "Z";
textBoxLin1.Text= "A";
textBoxLin2.Text = "B";
textBoxLin3.Text = "C";
textBoxLin4.Text = "D";
textBoxLin5.Text = "E";
textBoxCol1.Text = "A";
textBoxCol2.Text = "B";
textBoxCol3.Text = "C";
textBoxCol4.Text = "D";
textBoxCol5.Text = "E";
}

n fereastra principal, n meniu, se introduc dou opiuni noi, folosite pentru declanarea
criptrii, respectiv decriptrii.

Metode matematice de criptare i securitate a datelor

Tratm evenimentul click al opiunii de meniu de criptare folosind sistemul Polybios. Dac
ne ntoarcem din fereastra de alegere a cheii pe butonul Criptare, realizm criptarea, astfel nu facem
nimic.
private void polybiosToolStripMenuItem_Click(object sender, EventArgs e)
{
//Afisam fereastra de culegere a cheii de criptare
Polybios pol = new Polybios();
//Daca ne intoarcem pe butonul de criptare, criptam mesajul
if (pol.ShowDialog() == DialogResult.OK)
{
//preluam textul clar
string sir = textBoxClar.Text;
textBoxCriptat.Text = "";
//parcurgem textul clar caracter cu caracter
for (int i = 0; i < sir.Length; i++)
{
int lin, col;
//verificam daca caracterul curent e caracter alfabetic
if (DateCezar.findPolybios(sir[i], out lin, out col) == 0)
//daca nu e caracter alfabetic, il copiem
textBoxCriptat.Text += sir[i];
else
{
//daca e caracter alfabetic, il criptam
textBoxCriptat.Text += DateCezar.linie[lin];
textBoxCriptat.Text += DateCezar.coloana[col];
}
}
}
}

n fereastra principal, tratm evenimentul click al opiunii de meniu de decriptare folosind


sistemul Polybios. Dac ne ntoarcem din fereastra de alegere a cheii pe butonul Decriptare,
realizm decriptarea, astfel nu facem nimic.
private void polybiosToolStripMenuItem1_Click(object sender, EventArgs e)
{
//Afisam fereastra de culegere a cheii de decriptare
Polybios pol = new Polybios();
pol.Text = "Decriptare Polybios";
//Daca ne intoarcem pe butonul de decriptare, decriptam mesajul
if (pol.ShowDialog() == DialogResult.OK)
{
//preluam textul criptat
string sir = textBoxCriptat.Text;
textBoxClar.Text = "";
//parcurgem textul criptat caracter cu caracter
int i = 0;

Metode matematice de criptare i securitate a datelor

while (i < sir.Length)


{
int lin, col;
//verificam daca caracterul curent e caracter alfabetic
if (DateCezar.findPolybios(sir[i], out lin, out col) == 0)
//daca nu e caracter alfabetic, il copiem
{
textBoxClar.Text += sir[i];
i++; //trecem la urmatorul caracter
}
else
{
//daca e caracter alfabetic, aflam pozitia sa in matrice
int pozlin = -1;
int pozcol = -1;
for (int k = 0; k < 5;k++)
{
if (DateCezar.linie[k] == sir[i])
pozlin = k;
if (DateCezar.coloana[k] == sir[i + 1])
pozcol = k;
}
//decriptam perechea de caractere de pe pozitiile i si i+1
textBoxClar.Text += DateCezar.mat[pozlin,pozcol];
i=i+2; //trecem la perechea urmatoare
}
}

S-ar putea să vă placă și