CUPRINS
1.Tema proiectului.............................................................................................2 2. Specificaţii ......................................................................................................5 3. Design ...........................................................................................................7 4. Codul aplicației ............................................................................................. 11 5. Teste, erori, execuție .................................................................................... 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 creşte permanent pentru a obţine o securitate cât mai ridicată a comunicaţiilor. Pe parcursul câtorva episoade, vom prezenta unele dintre cele mai cunoscute modalităţi 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 menționat de poetul grec Archilocus ce a trăit în secolul 7 î.e.n., numit scytal de la grecescul σκυτάλη (baston). Acesta era utilizat de Spartani și vechii Greci, constituind un cifru de transpoziție constând dintr-o fâșie din piele care odată înfășurată în jurul unui baston de un anumit diametru era inscripționată cu mesajul de criptat prin desfășurarea de pe baston sensul mesajului era ascuns, recipientul înfășura fâșia pe un baston de un diametru similar decriptând astfel mesajul. Evident această metodă de criptare nu era una dintre cele mai sigure acesta putând fi ușor decriptat. Unul dintre primii care au folosit tehnici de criptare bazate pe algoritmi pentru trimiterea mesajelor a fost celebrul împărat roman Cezar. În comunicarea privată cu o persoană, folosirea unui cod secret poate preveni citirea intenţionată sau neintenţionată a mesajelor de către cei care intră în posesia acestora, fie pentru că trebuie să le transporte până la destinatar, fie pentru că le interceptează în timp ce mesajul este transmis. Criptarea reprezintă o metodă prin care un text necriptat (documente, fişiere, fraze, cuvinte etc.) este transformat, utilizând anumite metode, într-un alt text, numit text criptat, care se păstrează în această formă sau se trimite unei anumite persoane. Criptarea este utilizată cu scopul de a păstra secretul unei anumite informaţii. În cazul în care informaţia criptată ajunge şi la alte persoane, altele decât cele care trebuie să o primească sau să o păstreze, nu se poate obţine textul original decât dacă este cunoscută tehnica de criptare folosită şi, eventual, o parolă utilizată în procesul de criptare. Criptografia este ştiinţa care foloseşte matematica pentru a cripta şi decripta informaţii; cu alte cuvinte, pentru a securiza informaţiile stocate ori transmise. Reversul medaliei este criptanaliza - ştiinţa analizării ş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ă complexităţii algoritmilor folosiţi pentru codificare, procesul invers, cel de decriptare, este aproape imposibil de realizat. 2
Criptarea informațiilor se face cu ajutorul unui algoritm şi a unei chei de criptare. Algoritmul este o funcţie matematică folosită efectiv în procesul de criptare şi decriptare. Combinarea algoritmului cu o anume cheie de criptare dă un rezultat diferit de combinarea aceluiaşi algoritm cu o altă cheie de criptare. Tăria criptării depinde atât de tăria algoritmului, cât şi de tăria cheii de criptare. În urma criptării, informaţiile devin indescifrabile; fără a avea cheia cu care s-a efectuat criptarea, decriptarea este imposibilă (sau cel puţin aşa se vrea). Multă vreme, eforturile criptografilor au fost dirijate spre întărirea cifrurilor prin complicarea algoritmului, combinând substituții și transpoziții asupra unor simboluri sau asupra unor blocuri (grupe de simboluri). Istoria modernă a criptografiei cunoaște numeroase inovații în această privință. Două sunt elementele ce au marcat însă cotitura semnificativă în dezvoltarea metodelor criptografice. Primul este legat de dezvoltarea rețelelor de calculatoare, al căror stimulent extraordinar s-a manifestat atât prin presiunea exercitată de tot mai mulți utilizatori (a căror dorinţă obiectivă este păstrarea secretului și a siguranței asupra poștei electronice private, a transferului electronic de fonduri și a altor aplicaţii) cât și prin potenţarea gamei de instrumente folosite efectiv în execuția algoritmilor de cifrare. Al doilea moment important în evoluția criptografiei moderne l-a constituit adoptarea unui principiu diferit de acela al cifrării simetrice. Whitfield Diffie şi Martin Hellman, cercetători 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 făcută publică. Doar destinatarul ce deține cea de-adoua cheie poate descifra mesajul. În cadul prezentului proiect se vor folosi următoarele tehnici de criptare: -
Criptarea Caesar, care reprezintă o criptare prin substituție (o literă din alfabet este înlocuită de o altă aflată la o distanță fixă de cea înlocuită). De exemplu o deplasare cu cinci poziții vom obține: 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ă jumătăți, care reprezintă o criptare prin transpoziție (textul împărțindu-se în două jumătăți poziționate una sub alta textul criptat citinduse pe verticală)
3
Același text vă arăta: 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 .
E
S
U
I
-
U I T N O .
R
P
.
R
N
C
T
O E
L
Interschimbare a biților adiacenți, reprezintă criptare la nivel de bit constând în interschimbarea biților adiacenți în cadrul fiecărui caracter. Textul de criptat va deveni: AJUTOR SUNTEM IN PERICOL ‚…ª¨ ¡£ª ¨ŠŽ† Š¡†ƒ Œ
4
2. Specificaţii Dimensiunea sirului prelucrat va fi de maxim 80 de caractere. Se recomandă atenție mărită la introducerea sirului pentru criptare. Nu este recomandată utilizarea săgeților, a tastelor Insert, Home, Delete, BackSpace acestea putând conduce (datorită particularităților mediului C) la funcționarea defectuoasă a aplicației. Aplicația va fi lansată în execuție prin comanda >projcr.exe. Automat se va încărca 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 tastând cifra corespunzătoare opțiunii. Se recomandă tastarea unei cifre din listă, în caz contrar programul va afișa 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ă selecție. La apăsarea opțiunii 1 se va afișa: -== C R I P T A R E C A E S A R ==Introduceti textul de criptat: 5
Aplicația va astepta introducrea textului si apăsarea tastei Enter. La apăsarea opțiunii 2 se va afișa: -== C R I P T A R E D O U A ==-== J U M A T A T I ==-
Introduceti textul de criptat: Aplicația va astepta introducrea textului si apăsarea tastei Enter. La apăsarea opțiunii 3 se va afișa: -== 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: Aplicația va astepta introducrea textului si apăsarea tastei Enter. La apăsarea opțiunii 4 se va afișa:
-== Parasim aplicatia ==-
Apasati orice tasta pentru a continua ... Aplicația va aștepta apăsarea oricărei taste
6
3. Design Programul este structurat în 5 funcții:
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 Funcție afișare_meniu 1. 2. 3. 4. 5. 6. 7.
function afisare_meniu integer opt write titlu write lista optiuni input opt return opt end function
7
Pseudocod Funcție 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 Funcție 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 Funcție 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
9
Pseudocod Funcție 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 aplicației #include #include #include #include #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
} 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
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>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, execuție Programul va începe prin afișarea meniului principal:
În cazul selectarii unui numar în afara intervalului:
15
Pentru prima optiune programul va executa criptarea Caesar:
Pentru a doua opțiune programul va executa criptarea prin două jumătăți:
16
Pentru a treia optiune programul va executa criptarea prin interschimbare biți adiacenți:
A patra optiune va conduce la inchiderea aplicației:
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