Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Chișinău, 2022
Lucrarea de laborator nr. 1
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):
#include<iostream>
int main()
{
message[i] = ch;
}
}
cout << "\n -------Mesajul criptat--------: \n" <<message;
if ( ch < 'a'){
ch = ch + 'z' - 'a' + 1;
}
message[i] = ch;
}
else if (ch >= 'A' && ch<= 'Z'){
ch = ch - key;
return 0;
}
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.
#include<stdio.h>
#include<string.h>
int main(){
char msg[] = "MARIA";
char key[] = "IA";
int msgLen = strlen(msg), keyLen = strlen(key), i, j;
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';
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.
#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);
}
}