Prezentarea PowerPoint pentru acest laborator poate fi găsită aici. Puteți lucra acest laborator folosind și platforma Google Colab, accesând acest link.
În acest laborator vom studia despre Message Authentication Codes (MAC).
În acest exercițiu vom ataca un algoritm nesigur din categoria MAC prin a arăta că un adversar poate falsifica o pereche de tipul (mesaj, tag), fără a avea acces la un oracol $\mathsf{Tag}$ care returnează tag pentru mesajul dorit.
Fie $F$ un $\mathsf{PRF}$. Arătați că următorul MAC este nesigur prin a construi un adversar eficient ce prezintă un avantaj ne-neglijabil împotriva algoritmului MAC. Cheia este $k \in \{0, 1\}^n$, iar pentru fiecare mesaj $m = m1 \| m2$ cu $\left|m_1\right| = \left|m_2\right| = n$, MAC-ul este calculat folosind următoarea formulă:
$\mathsf{Tag}(k, m_1 \| m_2) = F_k(m_1) \| F_k(F_k(m_2)) $
În acest exercițiu vom implementa Birthday attack pentru algoritmul SHA-1 folosind OpenSSL.
Scopul acestui atac este să obțină o coliziune pentru algoritmul de hashing SHA-1 folosind 2 mesaje $M_1$ și $M_2$, astfel încât pentru primii 4 bytes cele două hash digest-uri să fie egale ($\mathsf{SHA1}(M_1) = \mathsf{SHA1}(M_2)$).
Coliziunea trebuie să aibă o lungime de $32$ biți, ceea ce înseamnă că sunt necesare $2^{16}$ mesaje random pentru a efectua atacul. De reținut este că atacul nu este garantat să funcționeze din prima iterație; în medie, sunt necesare 2 iterații ale atacului pentru a găsi o coliziune.
Față de laboratoarele anterioare, acest laborator va fi realizat în C folosind următorul schelet de cod arhivă cod sau implementând atacul de la zero.
Pentru a obține digest-ului algoritmul de hashing SHA1 folosind OpenSSL, puteți folosi următorul exemplu:
SHA_CTX context; SHA1_Init(&context); SHA1_Update(&context, buffer, length); SHA1_Final(md, &context); /* md must point to at least 20 bytes of valid memory */
Descărcați biblioteca de la următorul link https://www.openssl.org/source/openssl-1.1.1d.tar.gz și dezarhivați fișierul descărcat.
Deschideți folderul dezarhivat și rulați următoarele comenzi folosind bash:
$ ./config --prefix=your_working_dir --openssldir=your_working_dir/openssl $ make $ make install_sw
Pentru a fixa Makefile-ul folosind noile path-uri, modificați variabilele de la începutul Makefile-ului cu următoarele:
LDFLAGS=-Lyour_working_dir/lib -lcrypto CFLAGS=-Wall -g -Iyour_working_dir/include