Sunteți pe pagina 1din 13

Ministerul Educației și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică și Microelectronică
Departamentul Informatică și Ingineria Sistemelor

RAPORT

Lucrarea de laborator nr. 1


la Securitatea Informațională

Elaborat: Zolotoi Veaceslav IA-202

A verificat: lector univ. V. Strună

Chișinău, 2022
Lucrarea de laborator nr. 1

Tema: Criptarea ca metodă de securitate a informaţiilor

Scopul lucrării: Acumularea deprinderilor practice de elaborare şi programare a alogoritmelor


de criptare simetrică utilizînd cifruri de substituție.

Obiectivele lucrării:
- înţelegerea şi familiarizarea cu tehnica de criptare prin cheie secretă;
- realizarea criptării şi decriptării mesajelor folosind metoda cifrului lui Cezar;
- realizarea criptării şi decriptării mesajelor folosind metoda cifrului lui Vigenere;
- realizarea criptării şi decriptării mesajelor folosind metoda cifrului lui Vernam.

Mersul lucrării:
Noţiuni principale din teorie şi metodele utilizate conform temei lucrării:
Criptografia reprezintă o ramură a matematicii care se ocupă cu securizarea informaţiei,
precum şi cu autentificarea şi restricţionarea accesului într-un sistem informatic [1]. În realizarea
acestora se utilizează în mare parte metode matematice, profitând de unele probleme cu
complexitate de rezolvare suficient de înaltă. Termenul „criptografie” este compus din cuvintele
de origine greacă κρυπτός, kryptós (ascuns) şi γράφειν, gráfein (a scrie) [2].
Criptografia urmăreşte următoarele obiective [3]:
1. Confidenţialitatea (privacy) – proprietatea de a păstra secretul informaţiei, pentru ca
aceasta să fie folosită numai de persoanele autorizate.
2. Integritatea datelor – proprietatea de a evita orice modificare (inserare, ştergere,
substituţie) neautorizată a informaţiei.
3. Autentificare – proprietatea de a identifica o entitate conform anumitor standarde.
Este compusă din: a. autentificarea unei entităţi; b. autentificarea sursei informaţiei;
4. Non-repudierea – proprietatea care previne negarea unor evenimente anterioare.
Condiţia problemei (sarcina de lucru):

1. Cifrul lui Cezar:


Cea mai simplă metodă de criptare, prin substituţie, este cunoscută în zilele noastre sub
denumirea de cifrul lui Cezar, după numele împăratului roman care a inventat-o. În acest cifru,
literelor alfabetului latin, de la A la Z, li se dau valori de la 0 la 25
1) Descrierea codului (textului, listing-ului) programului (aplicației):

#include<iostream>

using namespace std;

int main()
{

char message[100], ch;


int i, key;

cout << "Enter a message: ";


cin.getline(message, 100);
cout << "Enter key: ";
cin >> key;

for(i = 0; message[i] != '\0'; ++i){


ch = message[i];
if(ch >= 'a' && ch <= 'z'){
ch = ch + key;

if(ch > 'z'){


ch = ch - 'z' + 'a' - 1;
}
message[i] = ch;
}
else if (ch >= 'A' && ch<='Z'){
ch = ch + key;

if(ch > 'Z'){


ch = ch - 'Z' + 'A' - 1;
}

message[i] = ch;
}
}
cout << "\n -------Mesajul criptat--------: \n" <<message;

for(i = 0; message[i] != '\0'; ++i){


ch = message[i];

if(ch >= 'a' && ch <= 'z'){


ch = ch - key;

if ( ch < 'a'){
ch = ch + 'z' - 'a' + 1;
}

message[i] = ch;
}
else if (ch >= 'A' && ch<= 'Z'){
ch = ch - key;

if (ch > 'a'){


ch = ch + 'Z' - 'A' + 1;
}
message[i] = ch;
}
}

cout << "\n ------Mesajul decriptat--------: \n" << message;

return 0;
}

2) Testarea programului și rezultatele obținute:

Ca exemplu, drept mesaj s-a luat textul „maria”. Conform cifrului lui Cezar, litera M este sub
numărul 12, dacă ne vom deplasa la dreapta cu 3 valori (am indicat cheia 3), vom primi numărul
15 care este litera P. În acest mod s-a comportat cu fiecare caracter în parte.

2. Cifrul lui Vigenere:


În cazul cifrului lui Vigenere cheia este un cuvînt cu lungimea mai mică sau egală cu lungimea
mesajului de criptat.
1) Descrierea codului (textului, listing-ului) programului (aplicației):

#include<stdio.h>
#include<string.h>

int main(){
char msg[] = "MARIA";
char key[] = "IA";
int msgLen = strlen(msg), keyLen = strlen(key), i, j;

char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];


//generarea cheii noi

for(i = 0, j = 0; i < msgLen; ++i, ++j){


if(j == keyLen)
j = 0;

newKey[i] = key[j];
}

newKey[i] = '\0';
//criptarea
for(i = 0; i < msgLen; ++i)
encryptedMsg[i] = ((msg[i] + newKey[i]) % 26) + 'A';

encryptedMsg[i] = '\0';
//decriptarea
for(i = 0; i < msgLen; ++i)
decryptedMsg[i] = (((encryptedMsg[i] - newKey[i]) + 26) % 26) + 'A';

decryptedMsg[i] = '\0';

printf("Mesajul: %s", msg);


printf("\nCheia: %s", key);
printf("\nCheia noua generata: %s", newKey);
printf("\nEncrypted Message: %s", encryptedMsg);
printf("\nDecrypted Message: %s", decryptedMsg);

return 0;
}
2) Testarea programului și rezultatele obținute:

Așa dar, observăm că în cazul cifrului Vigenere se ia o cheie mai mică sau egală ca lungime cu
mesajul. În cazul nostru lungimea e mai mică, astfel se va genera o cheie nouă care va fi egală.
Ca și în exemplu de mai sus litera M va lua valoarea 12, iar litera I va lua valoarea 8. Obținem că
12+8=20. Conform tabelului, valoarea 20 o are litera U. În acest mod, observăm criptarea
corectă a mesajului.
3. Cifrul lui Vernam:
Cifrul lui Vernam constă într-o cheie constituită dintr-un şir se caractere aleatoare nerepetitive.
Fiecare literă a cheii se adaugă modulo 26 la o literă a mesajului clar. În această variantă, fiecare
literă a cheii se foloseşte o singură dată pentru un singur mesaj şi nu va mai putea fi folosită
niciodată. Lungimea şirului de caractere a cheii este egală cu lungimea mesajului. Metoda este
foarte utilă pentru criptarea mesajelor scurte.

1) Descrierea codului (textului, listing-ului) programului (aplicației):

#include<stdio.h>
char arr[50][50];
char message[20],key[20],emessage[20],retMessage[20];
int findRow(char);
int findColumn(char);
int findDecRow(char,int);
int main() {
int i=0,j,k,r,c;
k=96;
for (i=0;i<26;i++) {
k++;
for (j=0;j<26;j++) {
arr[i][j]=k++;
if(k==123)
k=97;
}
}

printf("\nMesajul:\n");
gets(message);
printf("\nEnter the key:\n");
gets(key);
// Criptarea
for (i=0;key[i]!=NULL;i++) {
c=findRow(key[i]);
r=findColumn(message[i]);
emessage[i]=arr[r][c];
}
emessage[i]='\0';
printf("\n----Mesajul criptat:\n\n");
for (i=0;emessage[i]!=NULL;i++)
printf("%c",emessage[i]);

//decriptarea
for (i=0;key[i]!=NULL;i++) {
c=findColumn(key[i]);
r=findDecRow(emessage[i],c);
retMessage[i]=arr[r][0];
}
retMessage[i]='\0';
printf("\n\n----Mesajul decriptat:\n\n");
for (i=0;retMessage[i]!=NULL;i++)
printf("%c",retMessage[i]);
// getch();
return(0);
}

int findRow(char c) {
int i;
for (i=0;i<26;i++) {
if(arr[0][i]==c)
return(i);
}
}

int findColumn(char c) {
int i;
for (i=0;i<26;i++) {
if(arr[i][0]==c)
return(i);
}
}

int findDecRow(char c,int j) {


int i;
for (i=0;i<26;i++) {
if(arr[i][j]==c)
return(i);
}
}

2) Testarea programului și rezultatele obținute:


După cum a fost menționat mai sus, cheia trebuie să fie egală cu lungimea mesajului și fiecare
literă să fie unică. Așa precum m=12, a=0, iar 12+0=12, și 12%26=12. Conform tabelului
valoarea 12 o are litera m. Observăm că obținem calcule corecte.
CONCLUZIE
În urma efectuării lucrării de laborator nr.1 am însușit metode de criptare și decriptare a
mesajelor text prin cele mai simple forme. Utilizând cele trei metode propuse: metoda lui Caesar,
metoda Vernam, metoda Vigenere am criptat, inițial, manual cuvintele iar mai apoi am elaborat
codul sursa pentru criptarea textelor. Toate codurile au fost compilate și rulate cu succes,
respectiv am primit aceleași rezultate pe când am calculat manual.
WEBOGRAFIE
1. https://ro.wikipedia.org/wiki/Cifrul_Cezar
2. Criptosistemul Vernam – InfoCad Blog (wordpress.com)

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