Sunteți pe pagina 1din 7

Metode matematice de criptare i securitate a datelor

LABORATOR 4
Sistemul de criptare afin

Sistemul de criptare afin este o generalizare a sistemului Cezar.


Astfel, vom avea:
1) P (mulimea textelor clare) = C (mulimea textelor criptate) =Z26 (mulimea numerelor de la
1 la 25)
2) Mulimea de elemente chei K {( a, b) | a, b Z 26 , cmmdc(a, 26) 1}
3) Funcia de criptare (pentru o cheie k=(a,b)): ek ( x) ax b(mod 26)
1
1
4) Funcia de decriptare (pentru o cheie k=(a,b)): d k ( y ) a y a (26 b)(mod 26)

Proprieti:
1) Condiia ca a s fie prim cu 26 asigur existena lui a-1 n Z26.
2) Orice cheie k K , K fiind spaiul cheilor, este determinat complet de valorile ntregi (a,b)
cu (a,26)=1. Sunt posibile 12 valori pentru a: 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25. Pentru
b sunt posibile 26 de valori, care se iau independent de a, cu singura excepia a=1, b=0
(care se exclude deoarece nu conduce la nicio criptare).
3) Deci card(K)=311, numr suficient de mic pentru reuita unui atac prin for brut.
4) Condiia cmmdc(a,26)=1 asigur injectivitatea aplicaiei ek. De exemplu, pentru
ek ( x) 10 x 1 , A i N se transform ambele n B, iar O nu apare ca imagine n alfabetul
substituiei.
Exemplu:
CRIPTAREA: pentru a=3, b=5 funcia de criptare este ek ( x ) 3x 5 , care poate fi reprezentat prin
tabelul:

sau, scris direct prin caractere

Astfel, textul clar PRIMAVARA TARZIE se cripteaz n YEDPFQFEF KDECDR.

Metode matematice de criptare i securitate a datelor


DECRIPTAREA:
Deoarece 3-1 = 9 (mod 26), decriptarea se realizeaz matematic folosind funcia
d k ( x) 9 x 7 (sau practic, se inverseaz cele dou linii ale tabelului de mai sus).
Vom dezvolta n continuare proiectul Criptare creat n primul laborator. Pentru preluarea
coeficienilor funciei de criptare, este nevoie de o nou fereastr care s conin datele referitoare la
cheie. Clasa care va gestiona aceast fereastr se numete Afin.

Aceast fereastr coine urmtoarele controale: dou controale de grupare (groupBoxCheie,


groupBoxProperties),

apte

textBoxuri

(textBoxA,

textBoxB,

textBoxFctCript,

textBoxFctDecript, texBoxClar, textBoxCriptare, textBoxDecriptare)

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.
n clasa DateCezar, clas existent n proiect, sunt adugate trei atribute pentru a memora
irurile de caractere generate de funcia de criptare i de funcia de decriptare.
//pentru sistemul afin
public static char[] textclar = new char[26];
public static char[] criptare = new char[26];
public static char[] decriptare = new char[26];

Tratm evenimentele KeyPress ale controalelor TextBoxA i TextBoxB, pentru a nu


permite dect introducerea de valori numerice.
private void textBoxA_KeyPress(object sender, KeyPressEventArgs e)
{
//permite introducerea doar a valorilor numerice

Metode matematice de criptare i securitate a datelor

if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(),
"\\d+"))
e.Handled = true;

private void textBoxB_KeyPress(object sender, KeyPressEventArgs e)


{
//permite introducerea doar a valorilor numerice
if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(),
"\\d+"))
e.Handled = true;
}

Pentru a putea construi funcia de decriptare, este nevoie s se calculeze inversul


coeficientului A. Acesta exist doar dac cmmdc(A,26)=1. Vom construi o funcie care va calcula
valoarea cmmdc(a,26) i o funcie care calculeaz inversul lui A, dac acesta exist.
int cmmdc(string A)
{
int y = 26;
int x = Convert.ToInt32(A);
while (x != y)
if (x > y)
x = x - y;
else
y = y - x;
return x;
}

int invers(int nr)


{
for (int i = 1; i <= 25; i++)
if ((nr * i) % 26 == 1)
return i;
return 0;
}

Evenimentele click ale celor dou butoane de comand nchid fereastra curent i determin
ntoarcerea n fereastra principal a proiectului. Butonul de criptare face i o verificare a existenei
inversului pentru coeficientul A.
private void buttonCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void buttonCript_Click(object sender, EventArgs e)
{
//verificam daca numarul A are invers pentru decriptare
if (cmmdc(textBoxA.Text) != 1)
MessageBox.Show("Nu exista invers pentru numarul A (cmmdc(A,26)=1)");
else
this.Close();
}

Metode matematice de criptare i securitate a datelor


Tratm evenimentul Load al ferestrei principale. Acesta iniializeaz atributele clasei
DateCezar folosite la criptare i decriptare.
private void Afin_Load(object sender, EventArgs e)
{
//initializam cu caracterele alfabetului latin array-urile folosite la
//criptare si decriptare
for (char i = 'A'; i <= 'Z'; i++)
{
DateCezar.textclar[i - 'A'] = i;
DateCezar.criptare[i - 'A'] = i;
DateCezar.decriptare[i - 'A'] = i;
}
//initializam cu caracterele alfabetului latin textboxurile-urile aferente
//array-urilor
textBoxClar.Text = "";
textBoxCritpare.Text = "";
textBoxDecriptare.Text = "";
for (int j = 0; j < 26; j++)
{
textBoxClar.Text += DateCezar.textclar[j] + " ";
textBoxCritpare.Text += DateCezar.criptare[j] + " ";
textBoxDecriptare.Text += DateCezar.decriptare[j] + " ";
}
}

Tratm evenimentele TextChanged ale controalelor textBoxA i textBoxB. Acestea verific


dac sunt introduse valori n ambele textboxuri, iar n caz afirmativ, determin cu ajutorul funciei
de criptare i a funciei de decriptare irurile de caractere ce vor fi folosite la criptarea, respectiv
decriptarea textului introdus. irurile calculate vor fi afiate n controalele textBoxCriptare i
textBoxDecriptare.
private void textBoxA_TextChanged(object sender, EventArgs e)
{
if (textBoxB.Text != "")
{
//convertim cheia in valori numerice
int x = Convert.ToInt32(textBoxA.Text);
int y = Convert.ToInt32(textBoxB.Text);
//afisam functia de criptare
textBoxFctCript.Text = "e(k)=" + textBoxA.Text + "x+" + textBoxB.Text;
//calculam inversul lui A
int a_1 = invers(x);
if (a_1!=0)
{
//calculam a^(-1)(26-b)(mod 26)
int b_1 = (a_1 * (26 - y)) % 26;
//Afisam functia de decriptare
textBoxFctDecript.Text = "d(k)=" + a_1.ToString() + "y+" +
b_1.ToString();
textBoxClar.Text = "";
textBoxCritpare.Text = "";
textBoxDecriptare.Text = "";
for (int i = 0; i < 26; i++)
{
//Aplicam functia de criptare
DateCezar.criptare[i] =Convert.ToChar((i * x + y) % 26);
//Aplicam functia de decriptare

Metode matematice de criptare i securitate a datelor

}
}

DateCezar.decriptare[i] =Convert.ToChar((i * a_1 + b_1) % 26);


//Afisam datele obtinute pentru criptare si decriptare
textBoxClar.Text += DateCezar.textclar[i] + " ";
textBoxCritpare.Text += DateCezar.criptare[i] + " ";
textBoxDecriptare.Text += DateCezar.decriptare[i] + " ";

}
private void textBoxB_TextChanged(object sender, EventArgs e)
{
if (textBoxA.Text != "")
{
//convertim cheia in valori numerice
int x = Convert.ToInt32(textBoxA.Text);
int y = Convert.ToInt32(textBoxB.Text);
//afisam functia de criptare
textBoxFctCript.Text = "e(k)=" + textBoxA.Text + "x+" + textBoxB.Text;
//calculam inversul lui A
int a_1 = invers(x);
if (a_1 != 0)
{
//calculam a^(-1)(26-b)(mod 26)
int b_1 = (a_1 * (26 - y)) % 26;
//Afisam functia de decriptare
textBoxFctDecript.Text = "d(k)=" + a_1.ToString() + "y+" +
b_1.ToString();
textBoxClar.Text = "";
textBoxCritpare.Text = "";
textBoxDecriptare.Text = "";
for (int i = 0; i < 26; i++)
{
//Aplicam functia de criptare
DateCezar.criptare[i] = DateCezar.textclar[(i * x + y) % 26];
//Aplicam functia de decriptare
DateCezar.decriptare[i] = DateCezar.textclar[(i * a_1 + b_1) % 26];
//Afisam datele obtinute pentru criptare si decriptare
textBoxClar.Text += DateCezar.textclar[i] + " ";
textBoxCritpare.Text += DateCezar.criptare[i] + " ";
textBoxDecriptare.Text += DateCezar.decriptare[i] + " ";
}
}
}
}

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 afin. Dac ne
ntoarcem din fereastra de alegere a cheii pe butonul Criptare, realizm criptarea, astfel nu facem
nimic.
private void sistemulAfinToolStripMenuItem_Click(object sender, EventArgs e)
{
//Afisam fereastra de culegere a cheii de criptare
Afin af = new Afin();
//Daca ne intoarcem pe butonul de criptare, criptam mesajul
if (af.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++)
{
//verificam daca caracterul curent e caracter alfabetic
int poz = -1;
for (int k = 0; k < 26; k++)
if (DateCezar.textclar[k] == sir[i])
poz = k;
//daca nu e caracter alfabetic, il copiem in textul criptat
if (poz == -1)
textBoxCriptat.Text += sir[i];
else
//daca e caracter alfabetic, il criptam
textBoxCriptat.Text += DateCezar.criptare[poz];
}
}
}

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


sistemul afin. Dac ne ntoarcem din fereastra de alegere a cheii pe butonul Decriptare, realizm
decriptarea, astfel nu facem nimic.
private void sistemulAfinToolStripMenuItem1_Click(object sender, EventArgs e)
{
//Afisam fereastra de culegere a cheii de decriptare
Afin af = new Afin();
af.Text = "Decriptare Functie afina";
//Daca ne intoarcem pe butonul de decriptare, decriptam mesajul
if (af.ShowDialog() == DialogResult.OK)
{
//preluam textul criptat
string sir = textBoxCriptat.Text;
textBoxClar.Text = "";
//parcurgem textul criptat caracter cu caracter
for (int i = 0; i < sir.Length; i++)
{
//verificam daca caracterul curent e caracter alfabetic
int poz = -1;
for (int k = 0; k < 26; k++)
if (DateCezar.textclar[k] == sir[i])
poz = k;
//daca nu e caracter alfabetic, il copiem in textul clar
if (poz == -1)

Metode matematice de criptare i securitate a datelor


textBoxClar.Text += sir[i];

else

//daca e caracter alfabetic, il decriptam


textBoxClar.Text += DateCezar.decriptare[poz];
}

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