Documente Academic
Documente Profesional
Documente Cultură
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:
fereastr
coine
urmtoarele
controale:
dou
controale
de
grupare
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++)
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++;
}
if (nr != 25)
MessageBox.Show("Exista valori duplicat in matrice. Reintroduceti
matricea!");
else
this.Close();
n fereastra principal, n meniu, se introduc dou opiuni noi, folosite pentru declanarea
criptrii, respectiv decriptrii.
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];
}
}
}
}