Skip to content

radu-catrangiu/stegano

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tema 2 IOCLA

Task 1:
    Functia "bruteforce_singlebyte_xor" are o variabila locala de un
BYTE in care tin cheia. Aceasta variabila este incrementanta intr-un
loop. In acest loop apelez functia "xor_matrix" (care face XOR cu toate
valorile din imagine), apoi apelez "find_revient" daca aceasta functie
intoarce o valoare mai mica decat [img_height] inseamna ca am gasit
linia cu mesajul. Altfel se trece mai departe, se apeleaza iar "xor_matrix"
pentru a aduce imaginea la starea initiala si se incrementeaza variabila
locala. Când este găsită cheia și linia la care se afla mesajul, acestea
sunt intoarse folosind EBX respectiv EAX.
    Functia "find_revient" are ca variabila locala string-ul "revient\0".
Aceasta functie are un loop principal in care este parcurs vectorul [img],
iar pentru fiecare valoare este apelată funcția "check_revient". Când este
gasit string-ul "revient" este apelata funcția "get_line_number" care imparte
byte_id-ul curent la numarul de linii pentru a obtine linia pe care se afla
string-ul.
    Functia "check_revient" primește doi vectori, img (vector DWORD) și
string-ul "revient" (vector BYTE). Aceasta functie parcurge folosind acelasi
index ambii vectori și compară valorile. Daca o valoare diferă acesta întoarce
0, iar daca nicio valoare nu diferă înseamnă că a fost găsit string-ul "revient"
și întoarce valoarea 0.

Task 2:
    Este apelată funcția de la task-ul 1 pentru a obtine cheia si linia
la care se afla mesajul, apoi folosind rezultatele intoarse de functia
"bruteforce_singlebyte_xor" este apelata functia "compute_new_key" care
aplică formula descrisă în enunț. Dupa obtinerea noii chei, este apelata
functia "write_msg_and_encode". Dupa executia acestei functii se apeleaza
functia "print_image" din scheletul temei.
    Functia "write_msg_and_encode" primeste ca parametri o cheie de criptare
si linia la care să fie scris mesajul. Aceasta are ca variabila locala
string-ul ce urmeaza sa fie scris. Este calculat byte_id-ul de unde se va
incepe scrierea. Intr-un loop sunt parcurse simultan raspunsul si imaginea,
având loc scrierea răspunsului. După terminarea buclei este apelată functia
"xor_matrix" care aplică noua cheie pe întreaga imagine.

Task 3:
    Se obtin întâi text-ul si byte_id-ul din argv[3] si argv[4]. Se apeleaza
atoi pentru a converti byte_id-ul intr-un intreg. Apoi se apeleaza functia
"morse_encrypt" (cu acelasi prototip ca in enunt). La final se apeleaza
functia "print_image" din scheletul temei.
    Functia "morse_encrypt" parcurge text-ul primit ca argument până cand 
este intalnit '\0', iar pentru fiecare caracter din string este apelata 
functia "write_morse" și este actualizat byte_id-ul adaugând offset-ul intors
de functia "write_morse".
    Functia "write_morse" primeste un caracter, vectorul img și un byte_id
de la care se dorește începerea scrierii. Funcția întoarce numărul de caractere
scrise. Aceasta functie are rolul unui dictionar care traduce fiecare caracter
in codul morse, rezultatul fiind scris in vectorul [img] incepand de la
byte_id-ul primit ca parametru.

Task 4:
    Se obtin întâi text-ul si byte_id-ul din argv[3] si argv[4]. Se apeleaza
atoi pentru a converti byte_id-ul intr-un intreg. Apoi se apeleaza functia
"lsb_encode" (cu acelasi prototip ca in enunt). La final se apeleaza functia
"print_image" din scheletul temei.
    Functia "lsb_encode" parcurge text-ul și pentru fiecare caracter, INCLUSIV
caracterul '\0', se apeleaza functia "break_to_bits_and_write" si se 
incrementanta byte_id-ul cu numarul de valori modificate (intotdeauna 8).
    Functia "break_to_bits_and_write" foloseste o mască pentru a obtine biții.
Intr-o bucla se face AND cu masca pe caracter si se verifica flag-ul de zero 
(se face jnz). Daca bit-ul este 0, pe valoarea din imagine se face AND cu masca
0xFFFFFFFE, altfel se face OR cu masca 0x00000001. Pentru a avansa si a obtine
restul biților se face SHIFT RIGHT. Functia returneaza numarul de scrieri, adica
intotdeauna 8.

Task 5:
    Se obtine byte_id-ul din argv[3] si se converteste la int prin apelul functiei
atoi, apoi se apeleaza functia "lsb_decode" (cu acelasi prototip ca in enunt).
    Functia "lsb_decode" itereaza prin vectorul primit ca parametru, din 8 in 8,
pornind de la byte_id. Aceasta apeleaza functia "build_char" care intoarce un BYTE
ce este stocat pe stivă intr-o variabila locala.
    Functia "build_char" foloseste masca 0x00000001 pentru a obtine LSB-ul din
valoarea curenta. Se verifica daca rezultatul operatiei AND este zero, caz in care
se trece mai departe deoarece in EAX deja bitii au fost initializati cu 0, altfel
se realizeaza operatia OR cu masca stocata in BL. Pentru a avansa se face SHIFT
RIGHT pe aceasta masca. La final, valoarea din EAX reprezinta un caracter din
mesajul criptat.

Task 6:
    TODO:

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published