Mașina timpului lui Gigel s-a defectat. Rămânând blocat în timpul pandemiei de ciumă bubonică, el și-a folosit toate talentele pentru a găsi un leac. Victorios, Gigel realizează că este important ca formula leacului său să fie bine pazită pentru a nu fi distrusă, așa că decide să învețe diverse soluții de criptare. Reușește să salveze din rămășițele mașinii timpului un editor de text și un asamblor nasm pentru arhitectura Intel x86.
Laboratorului 5: Rolul registrelor, adresare directă și bazată
înainte de începerea temei
Tema este formată din mai multe subpuncte, fiecare subpunct constând in implementarea unei funcţii de criptare sau de prelucrare a unui şir de caractere. Subpunctele pot fi rezolvate independent, însă puteți refolosi fragmente din rezolvarea unui subpunct în rezolvarea altor subpuncte, acolo unde considerați necesar. Fiecare subpunct va fi rezolvat într-un fişier separat.
Prima oara, Gigel dorește să implementeze One Time Pad. Algoritmul constă in efectuarea operţiei XOR între un mesaj(plain) şi o cheie(key), de aceeaşi lungime cu mesajul, astfel:
cipher[i] = plain[i] ^ key[i]
Se cere implementarea, în assembly, a funcţiei care realizează criptarea One Time Pad.
Antetul funcţiei, în C, este:
void otp(char *ciphertext, char *plaintext, char *key, int length)
Nemulțumit de securitatea soluției precedente, Gigel încearcă și Cifrul Caesar. Acesta primeşte un mesaj şi o cheie, reprezentată de un număr, şi deplasează circular fiecare literă din mesaj cu valoarea specificată de cheie. Prin deplasare circulară se înţelege că literele mici vor rămâne, după deplasare, litere mici, iar literele mari vor rămane litere mari.
Exemplu de criptare, pentru mesajul “Azazel”, folosind cheile 0, 1, 2, 3:
Mesaj | Cheie | Codificare |
---|---|---|
Azazel | 0 | Azazel |
1 | Babafm | |
2 | Cbcbgn | |
3 | Dcdcho |
Antetul funcţiei, în C, este:
void caesar(char *ciphertext, char *plaintext, int key, int length)
Dorind să iși păstreze opțiunile deschise, Gigel incearcă și Cifrul Vigenere. Acesta primeşte mesajul ce urmeaza să fie criptat şi o cheie, reprezentată de un şir de majuscule. În cazul în care cheia este mai scurtă decât mesajul, aceasta se extinde la lungimea mesajului, prin repetarea cheii initiale. Apoi, fiecare literă din mesaj este deplasată circular la dreapta de un număr de ori egal cu poziţia în alfabet (începând de la poziţia 0) a literei corespunzătoare din cheie.
Exemplu de criptare:
Mesaj: Donald Trump Cheie: BIDEN Cheie extinsă: BIDENB IDENBI Mesaj criptat: Ewqeye Buyzq
Prima literă din mesaj, 'D', este deplasată cu o poziţie la dreapta, devenind 'E', întrucât poziţia literei corespunzătoare din cheia extinsă, 'B', în alfabet, este 1 (numerotarea începe de la 0).
Antetul funcţiei, în C, este:
void vigenere(char *ciphertext, char *plaintext, int plaintext_len, char *key, int key_len)
Realizând că formula lui este destul de alambicată, Gigel dorește un mod rapid de a găsi cuvinte chieie. SrtStr este o funcție ce găsește prima apariție a unui subșir intr-un șir sursă. Se cere implementarea sa in assembley.
Antetul funcţiei, în C, este:
void my_strstr(int *substr_index, char *haystack, char *needle, int haystack_len, int needle_len);
Pentru a fi mai ușor de depanat problemele cu programele sale, Gigel dorește să înțeleagă puțin mai bine limbajul mașina. Scopul este realizarea unei funcții ce va trece numerele din baza 2 in baza 16.
Antetul funcţiei, în C, este:
void bin_to_hex(char *hexa_value, char *bin_sequence, int length);
Veti transforma secventa de biti primita ca parametru in corespondenta sa din baza 16.
1011111011101111 --> 1011 1110 1110 1111 --> beef
În schelet este inclus şi checker-ul, împreună cu testele folosite de acesta. Pentru a executa toate testele, se pot folosi comenzile make run
sau ./checker
, după ce checker-ul a fost compilat, folosind make
.
Pentru a testa doar un subpunct, se poate folosi ./checker <n>
unde n este numărul subpunctului.
SKEL_FOLDER=../skel/ make
Formatul fişierelor de intrare pentru One Time Pad şi Caesar este:
length plaintext key
Formatul fişierelor de intrare pentru Vigenere este:
plain_len key_len plaintext key
Formatul fişierelor de intrare pentru bin_to_hex este:
length binary_text
Formatul fişierelor de intrare pentru my_strstr este:
str_length substr_length string substring
Temele vor trebui încărcate pe platforma vmchecker (în secțiunea IOCLA) și vor fi testate automat.
Arhiva încărcată va fi o arhivă .zip
care trebuie să conțină:
otp.asm caesar.asm vigenere.asm bin_to_hex.asm my_strstr.asm
README
ce conține descrierea implementăriiPunctajul final acordat pe o temă este compus din:
Se va ține cont de:
Temele care nu trec de procesul de asamblare (build) nu vor fi luate în considerare.
Scheletul şi checker-ul sunt disponibile pe repository-ul de IOCLA.
Ultima modificare a checker-ului: 13.11.2020, ora 12:02