Sunteți pe pagina 1din 18

CUPRINS

1.Tema proiectului.............................................................................................2
2. Specificaii ......................................................................................................5
3. Design ...........................................................................................................7
4. Codul aplicaiei ............................................................................................. 11
5. Teste, erori, execuie .................................................................................... 15
6. Bibliografie ................................................................................................... 18

1.Tema proiectului
Prezentul proiect i propune executarea unui program de criptare a unui ir de
caractere introdus de la tastatur, prin trei metode.
Criptarea mesajelor este unul dintre cele mai studiate domenii din zilele noastre.
Complexitatea tehnicilor de criptare i de trimitere a mesajelor crete permanent
pentru a obine o securitate ct mai ridicat a comunicaiilor. Pe parcursul ctorva
episoade, vom prezenta unele dintre cele mai cunoscute modaliti de codificare a
mesajelor.
Criptarea mesajelor i trimiterea lor sub aceast form este utilizat de foarte mult
timp. Din dovezi indirecte unul dintre primele instrumente de criptare decriptare a
fost menionat de poetul grec Archilocus ce a trit n secolul 7 .e.n., numit scytal de
la grecescul (baston). Acesta era utilizat de Spartani i vechii Greci,
constituind un cifru de transpoziie constnd dintr-o fie din piele care odat
nfurat n jurul unui baston de un anumit diametru era inscripionat cu mesajul
de criptat prin desfurarea de pe baston sensul mesajului era ascuns, recipientul
nfura fia pe un baston de un diametru similar decriptnd astfel mesajul. Evident
aceast metod de criptare nu era una dintre cele mai sigure acesta putnd fi uor
decriptat. Unul dintre primii care au folosit tehnici de criptare bazate pe algoritmi
pentru trimiterea mesajelor a fost celebrul mprat roman Cezar. n comunicarea
privat cu o persoan, folosirea unui cod secret poate preveni citirea intenionat
sau neintenionat a mesajelor de ctre cei care intr n posesia acestora, fie pentru
c trebuie s le transporte pn la destinatar, fie pentru c le intercepteaz n timp
ce mesajul este transmis.
Criptarea reprezint o metod prin care un text necriptat (documente, fiiere, fraze,
cuvinte etc.) este transformat, utiliznd anumite metode, ntr-un alt text, numit text
criptat, care se pstreaz n aceast form sau se trimite unei anumite persoane.
Criptarea este utilizat cu scopul de a pstra secretul unei anumite informaii. n
cazul n care informaia criptat ajunge i la alte persoane, altele dect cele care
trebuie s o primeasc sau s o pstreze, nu se poate obine textul original dect
dac este cunoscut tehnica de criptare folosit i, eventual, o parol utilizat n
procesul de criptare.
Criptografia este tiina care folosete matematica pentru a cripta i decripta
informaii; cu alte cuvinte, pentru a securiza informaiile stocate ori transmise.
Reversul medaliei este criptanaliza - tiina analizrii i spargerii codurilor prin care
se codific datele. Cele dou, criptografia i criptanaliza sunt denumite generic
criptologie.
Exist foarte multe tehnici de criptare cunoscute de foarte multe persoane, dar cu
toate acestea, pentru tehnicile avansate, datorit complexitii algoritmilor folosii
pentru codificare, procesul invers, cel de decriptare, este aproape imposibil de
realizat.
2

Criptarea informaiilor se face cu ajutorul unui algoritm i a unei chei de criptare.


Algoritmul este o funcie matematic folosit efectiv n procesul de criptare i
decriptare. Combinarea algoritmului cu o anume cheie de criptare d un rezultat
diferit de combinarea aceluiai algoritm cu o alt cheie de criptare. Tria criptrii
depinde att de tria algoritmului, ct i de tria cheii de criptare. n urma criptrii,
informaiile devin indescifrabile; fr a avea cheia cu care s-a efectuat criptarea,
decriptarea este imposibil (sau cel puin aa se vrea).
Mult vreme, eforturile criptografilor au fost dirijate spre ntrirea cifrurilor prin
complicarea algoritmului, combinnd substituii i transpoziii asupra unor simboluri
sau asupra unor blocuri (grupe de simboluri). Istoria modern a criptografiei
cunoate numeroase inovaii n aceast privin. Dou sunt elementele ce au marcat
ns cotitura semnificativ n dezvoltarea metodelor criptografice.
Primul este legat de dezvoltarea reelelor de calculatoare, al cror stimulent
extraordinar s-a manifestat att prin presiunea exercitat de tot mai muli utilizatori
(a cror dorin obiectiv este pstrarea secretului i a siguranei asupra potei
electronice private, a transferului electronic de fonduri i a altor aplicaii) ct i prin
potenarea gamei de instrumente folosite efectiv n execuia algoritmilor de cifrare.
Al doilea moment important n evoluia criptografiei moderne l-a constituit adoptarea
unui principiu diferit de acela al cifrrii simetrice. Whitfield Diffie i Martin Hellman,
cercettori la Univeritatea Stanford din California, prin articolul 'New Directions n
Criptography', publicat n 1976 n revista IEEE Tranactions on Information Theory,
au pus bazele 'criptografiei asimetrice' cu chei publice, n locul unei singure chei
secrete se utilizeaz dou chei diferite una pentru criptare i cealalt pentru
decriptare, fiind imposibil deducerea uneia din cealalt, una din chei este fcut
public. Doar destinatarul ce deine cea de-adoua cheie poate descifra mesajul.
n cadul prezentului proiect se vor folosi urmtoarele tehnici de criptare:
-

Criptarea Caesar, care reprezint o criptare prin substituie (o liter din


alfabet este nlocuit de o alt aflat la o distan fix de cea nlocuit).
De exemplu o deplasare cu cinci poziii vom obine:
A J U T O R
S U N T E M
I N
P E R I C O L
F O Z Y T W
X Z S Y J R
N S
U J W N H T Q
-

Criptarea cu dou jumti, care reprezint o criptare prin transpoziie (textul


mprindu-se n dou jumti poziionate una sub alta textul criptat citinduse pe vertical)

Acelai text v arta:


1 1 1 1
1 2 3 4 5 6 7 8 9 0 1 2 3
A J U T O R . S U N T E M
M . I N . P E R I C O L

1
4

1 1
5 6
I N

1
7

1 1 2 2 2 2 2
8 9 0 1 2 3 4
P E R I C O L

A M J .

U I T N O .

O E

Interschimbare a biilor adiaceni, reprezint criptare la nivel de bit constnd


n interschimbarea biilor adiaceni n cadrul fiecrui caracter.
Textul de criptat va deveni:
AJUTOR SUNTEM IN PERICOL

2. Specificaii
Dimensiunea sirului prelucrat va fi de maxim 80 de caractere.
Se recomand atenie mrit la introducerea sirului pentru criptare. Nu este
recomandat utilizarea sgeilor, a tastelor Insert, Home, Delete, BackSpace acestea
putnd conduce (datorit particularitilor mediului C) la funcionarea defectuoas a
aplicaiei.
Aplicaia va fi lansat n execuie prin comanda >projcr.exe.
Automat se va ncrca meniul principal:

-== P R O G R A M C R I P T A R E ==-

Va rugam sa alegeti una dintre optiuni tastand cifra...

1. Criptare Caesar
2. Criptare cu doua jumatati
3. Criptare prin interschimbare biti adiacenti
4. Iesire

Se va selecta optiunea tastnd cifra corespunztoare opiunii. Se recomand


tastarea unei cifre din list, n caz contrar programul va afia urmatorul mesaj:

Alegeti NUMAI optiunile din lista (1-4)


Apasati orice tasta pentru a continua ...
Dup care se va reveni n meniul principal pentru o nou selecie.
La apsarea opiunii 1 se va afia:
-== C R I P T A R E C A E S A R ==Introduceti textul de criptat:
5

Aplicaia va astepta introducrea textului si apsarea tastei Enter.


La apsarea opiunii 2 se va afia:
-== C R I P T A R E D O U A ==-== J U M A T A T I ==-

Introduceti textul de criptat:


Aplicaia va astepta introducrea textului si apsarea tastei Enter.
La apsarea opiunii 3 se va afia:
-== C R I P T A R E P R I N I N T E R S C H I M B A R E ==-== B I T I A D I A C E N T I ==Introduceti textul de criptat:
Aplicaia va astepta introducrea textului si apsarea tastei Enter.
La apsarea opiunii 4 se va afia:

-== Parasim aplicatia ==-

Apasati orice tasta pentru a continua ...


Aplicaia va atepta apsarea oricrei taste

3. Design
Programul este structurat n 5 funcii:

int afisare_meniu();

// Afisaza meniul principal

int executa_optiune(int optiune); // Evalueaza optiunea si apeleaza functia selectata


void caesar();

//Criptare Caesar

void C_4();

//Criptare cu doua jumatati

void C_9();

//Criptare prin interschimbare biti adiacenti

Pseudocod Program Principal


1. main
2. integer optiune, rezultat
3. do
4. optiune = afisare_meniu()
5. rezultat= executa_optiune(optiune)
6. while rezulat <> 0
7. clear screen
8. write mesaj sfarsit
9. write mesaj asteptare
10. wait keypressed
11. end main

Pseudocod Funcie afiare_meniu


1.
2.
3.
4.
5.
6.
7.

function afisare_meniu
integer opt
write titlu
write lista optiuni
input opt
return opt
end function

Pseudocod Funcie executa_optiune


1. function executa_optiune
2. select case of optiune
3. case 1: caesar() end function 1
4. case 2: c_4() end function 1
5. case 3: c_9()end function 1
6. case 4: end function 0
7. default
8. write mesaj avertizare
9. write mesaj asteptare
10. wait keypressed
11. end function 1
12. end case
Pseudocod Funcie caesar
1. function caesar
2. integer ofset, i
3. ofset = 3
4. character out_r[80], textcfr[80]
5. clear screen
6. write mesaj
7. write mesaj asteptare
8. if not input textcfr
9. write mesaj eroare
10. write mesaj asteptare
11. wait keypressed
12. end function
13. end if
14. for i = 0 step 1 to length of textcfr
15. if texcfr[i] is letter
16. convert textcfr[i] to upper letter
17. out_r[i] = ((textcfr[i]- `A`)+ofset)%26+`A`
18. else
19. out_r[i]=textcfr[i]
20. end if
21. end for
22. out_r[length of textcfr]=\0
23. write out_r
24. write mesaj asteptare
25. wait keypressed
26. end function
8

Pseudocod Funcie c_4


1. function c_4
2. integer i,j
3. ofset = 3
4. character out_r[80], textcfr[80]
5. clear screen
6. write mesaj titlu
7. write mesaj asteptare
8. if not input textcfr
9. write mesaj eroare
10. write mesaj asteptare
11. wait keypressed
12. end function
13. end if
14. i= length of textcfr
15. if i%2 not 0
16. textcfr[i]= `
17. textcfr[i+1]= \0`
18. i = i + 1
19. end if
20. out_r[i]=\0
21. for i = 0 step 1 to (i/2)
22. out_r[2*j]=texrcfr[j]
23. out_r[2*j+1]=texrcfr[i/2+j]
24. end for
25. write out_r
26. write mesaj asteptare
27. wait keypressed
28. end function

Pseudocod Funcie c_9


1. function c_4
2. integer i,j
3. ofset = 3
4. character out_r[80], textcfr[80]
5. clear screen
6. write mesaj titlu
7. write mesaj asteptare
8. if not input textcfr
9. write mesaj eroare
10. write mesaj asteptare
11. wait keypressed
12. end function
13. end if
14. for i = 0 step 1 to length of textcfr
15. out_r[i]=0
16. for j = 0 step 1 to 4
17. out_r[i] = out_r[i]+(texrcfr[i] &(1<<(2*j)))<<1
18. out_r[i] = out_r[i]+(texrcfr[i] &(1<<(2*j)))>>1
19. end for
20. end for
21. out_r[length of textcfr]=\0
22. write out_r
23. write mesaj asteptare
24. wait keypressed
25. end function

10

4. Codul aplicaiei
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define N 80
//Declarare Functii
int afisare_meniu();
int executa_optiune(int
selectata
void caesar();
void C_4();
void C_9();

// Afisaza meniul principal


optiune); // Evalueaza optiunea si apeleaza functia
//Criptare Caesar
//Criptare cu doua jumatati
//Criptare prin interschimbare biti adiacenti

void main()
{
int optiune, rezultat;
do
{
optiune=afisare_meniu();
rezultat=executa_optiune(optiune);
}
while(rezultat!=0);
clrscr();
printf("\n\n\n\n\n\n\n\n\n\n
-== Parasim aplicatia ==\n\n\n\n\n\n\n\n\n\n\n");
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
}
int afisare_meniu()
{
int opt;
clrscr();
// Sterge ecranul
// Afiseaza optiunile
printf("
-== P R O G R A M C R I P T A R E ==\n\n\n\n\n\n");
printf("Va rugam sa alegeti una dintre optiuni tastand cifra...\n\n");
printf("1. Criptare Caesar\n");
printf("2. Criptare cu doua jumatati\n");
printf("3. Criptare prin interschimbare biti adiacenti\n");
printf("4. Iesire\n");
11

opt=getch()-'0';
clrscr();
return opt;

// Citim si stocam ca intreg


// Returnam valoare citita

int executa_optiune(int optiune)


{
// Evaluam alegerea si apelam functia selectata
switch (optiune)
{
case 1: caesar();
return 1;
case 2: C_4();
return 1;
case 3: C_9();
return 1;
case 4:
return 0;
default:
printf("Alegeti NUMAI optiunile din lista (1-4)\n");
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
return 1;
}
}
void caesar()
{
unsigned int ofset=3,i;
char out_r [N];
char textcfr [N];
clrscr();
printf("
-== C R I P T A R E C A E S A R ==-\n\n\n\n\n\n");
printf("Introduceti textul de criptat:\n");
if(!gets(textcfr))
//Zona in care verific erorile de citire I/O
{
printf("Nu cred ca ai introdus corect...\n");
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
return;
}
for (i=0;i<strlen(textcfr);i++)
{
if(isalpha(textcfr[i]))
//Verificam daca este caracter
{
textcfr[i] = toupper(textcfr[i]); //Folosim functia pentru a nu avea probleme cu
tipul de caractere A..Z a..z
out_r[i] = ((textcfr[i]-'A')+ofset)%26+'A'; //Substituim litera
}
else
//daca nu e litera il stochez ca atare.
out_r[i]=textcfr[i];
12

}
out_r[strlen(textcfr)]='\0';
//Marchez sfarsitul sirului pentru tiparire
printf("%s",out_r);
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
}
void C_4()
//Criptare cu doua jumatati
{
int i, j;
char out_r[N];
char textcfr[N];
clrscr();
printf("
-== C R I P T A R E D O U A ==-\n");
printf("
-== J U M A T A T I ==-\n\n\n\n\n");
printf("Introduceti textul de criptat:\n");
if(!gets(textcfr))
//Zona in care verific erorile de citire I/O
{
printf("Nu cred ca ai introdus corect...\n");
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
return;
}
i=strlen(textcfr);
//Verific daca sirul are numar par de caractere
if (i%2!=0)
{
textcfr[i]=' ';
//Daca sirul este impar adaug ' ' la sfarsit
textcfr[i+1]='\0';
//Marchez sfarsitul sirului
i++;
}
out_r[i]='\0';
//Marchez sfarsitul sirului in caz ca e par
for(j=0;j<i/2;j++)
{
out_r[2*j+0]=textcfr[j]; //Construim sirul rezultat pentru valorile
pare
out_r[2*j+1]=textcfr[i/2+j];//Construim sirul rezultat pentru valorile impare
}
printf("%s",out_r);
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
}
void C_9()
//Criptare prin interschimbare biti adiacenti
{
unsigned int i,j;
char out_r[N];
13

char textcfr[N];
clrscr();
printf("
-== C R I P T A R E P R I N I N T E R S C H I M B A R E ==-\n");
printf("
-== B I T I A D I A C E N T I ==-\n\n\n\n\n");
printf("Introduceti textul de criptat:\n");
if(!gets(textcfr))
{
printf("Nu cred ca ai introdus corect...\n");
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
return;
}
for(i=0;i<strlen(textcfr);i++)
{
out_r[i]=0;
for(j=0;j<4;j++)
{
out_r[i]+=(textcfr[i] & (1<<(2*j+0)))<<1; //masca pentru bitii pari
out_r[i]+=(textcfr[i] & (1<<(2*j+1)))>>1; // masca pentru bitii impari
}
}
out_r[strlen(textcfr)]='\0';
printf("%s",out_r);
printf("\nApasati orice tasta pentru a continua ...\n");
getch();
}

14

5. Teste, erori, execuie


Programul va ncepe prin afiarea meniului principal:

n cazul selectarii unui numar n afara intervalului:

15

Pentru prima optiune programul va executa criptarea Caesar:

Pentru a doua opiune programul va executa criptarea prin dou jumti:

16

Pentru a treia optiune programul va executa criptarea prin interschimbare bii


adiaceni:

A patra optiune va conduce la inchiderea aplicaiei:

17

6. Bibliografie
Note de curs
Laboratoar Programarea Calculatoarelor
Proiect Programarea Calculatoarelor
Turbo C++ Octavian Catrina, Iuliana Cojocaru, Ed. Teora ISBN 973-601-106-9
Revista Ginfo Februarie Martie 2002
http://en.wikipedia.org
http://www.scientia.ro/tehnologie

18