This shows you the differences between two versions of the page.
ic:labs:08 [2021/12/03 20:06] valentina.iliescu |
ic:labs:08 [2023/11/22 01:03] (current) razvan.smadu [Exercițiul 1 - OpenSSL în linia de comanda (3p)] |
||
---|---|---|---|
Line 2: | Line 2: | ||
Prezentarea PowerPoint pentru acest laborator poate fi găsită [[https://drive.google.com/file/d/188HfjYdDqc97bPXiaF6tccVcU4pSy6-f/view?usp=sharing|aici]]. | Prezentarea PowerPoint pentru acest laborator poate fi găsită [[https://drive.google.com/file/d/188HfjYdDqc97bPXiaF6tccVcU4pSy6-f/view?usp=sharing|aici]]. | ||
+ | |||
+ | ==== Exercițiul 1 - OpenSSL în linia de comanda (3p) ==== | ||
+ | |||
+ | OpenSSL este o suita de funcții criptografice, care oferă atât o facilitate de unelte în linie de comandă | ||
+ | cât și o librărie folosită pentru aplicații (e.g. C/Python). Aici vom face câteva exerciții cu OpenSSL | ||
+ | în linie de comandă ca să pridenți ceva experiență cu aceste funcții foarte populare și utile. | ||
+ | |||
+ | Acum: ati primit niste fisiere top secret in arhiva {{:ic:labs:top_secret.zip|top secret}}. | ||
+ | Aceasta contine un fisier binar (data_enc_mac.bin) cu un mesaj criptat + un MAC, i.e. | ||
+ | |||
+ | file = enc(ke,m) + mac-cbc(km,m) | ||
+ | |||
+ | Vreti sa aflati mesajul secret si sa verificati ca este corect (mac corect). | ||
+ | Pentru asta va trebuie cheile de criptare (ke) si de MAC (km). | ||
+ | Stim ca criptarea s-a facut cu aes-128-cbc cu iv=000.00 (16 octeti) iar mac-ul este CMAC cu AES-128-CBC. | ||
+ | |||
+ | Din fericire mai avem in arhiva un fisier (tot binar, data_kek.bin.pass_hellokitty) care contine un master key (k0), dar care | ||
+ | este criptat si el cu aes-128-cbc si pbkdf2, cu passphrase din numele fisierului. | ||
+ | |||
+ | Mai stim ca putem folosi acest master key (k0) pentru a deriva cheile de criptare si MAC de mai sus (ke, km) | ||
+ | prin aplicarea functiei SHA256, i.e. (ke, km) = SHA256(k0) | ||
+ | |||
+ | Acum stim cam tot ce avem nevoie pentru a afla si a verifica mesajul secret. | ||
+ | Care este acest mesaj? | ||
+ | |||
+ | Vedeti [[https://www.openssl.org/docs/man1.1.1/man1/enc.html|aici]] informatii ajutatoare pentru criptare si criptare cu pbkdf, [[https://www.openssl.org/docs/man1.1.1/man1/openssl-dgst.html|aici]] informatii pentru SHA256 si | ||
+ | [[https://www.openssl.org/docs/man3.0/man1/openssl-mac.html|aici]] pentru MAC. | ||
+ | |||
+ | * Incepeti prin verificarea versiunii de OpenSSL (eu am folosit 3.0.2): | ||
+ | <code> | ||
+ | #openssl version | ||
+ | </code> | ||
+ | |||
+ | * Apoi decriptati fisierul binar kek cu passphrase-ul din numele fisierului pentru a obtine k0 (vedeti openssl enc ... -pbkdf2...). | ||
+ | <code> | ||
+ | #openssl enc -d -aes128 -pbkdf2 -in... | ||
+ | </code> | ||
+ | |||
+ | * Acum folositi SHA256 pentru a obtine (ke|km) = SHA256(k0). Vedeti openssl -dgst. Puteti face pipe ca sa trimiteti date de intrare catre SHA256 sau alte functii openssl, e.g.: | ||
+ | <code> | ||
+ | #echo -n $k0 | openssl dgst -sha256 | ||
+ | </code> | ||
+ | unde k0 contine cheia aflata la punctul precedent (hint: ar trebui sa fie gustoasa...). | ||
+ | |||
+ | |||
+ | * Cu ke (primii 16 octeti din rezultatul de mai sus) putem decripta mesajul (folositi -nopad, nu e nevoie de padding). Vedeti openssl enc -d .... Aici trebuie sa folositi primii N-16 octeti din fisier (ultimii 16 sunt MAC-ul). Puteti trunchia cu cat sau alta metoda la alegere, e.g.: | ||
+ | <code> | ||
+ | #cat data_enc_mac.bin | head -c80 | ||
+ | </code> | ||
+ | |||
+ | apoi folositi iarasi openssl enc -aes128 -d -K... -iv... -nopad (cu parametru in fisier sau cu pipe ca mai sus) | ||
+ | ca sa decriptati mesajul. | ||
+ | |||
+ | * In sfarsit, puteti verifica ca mesajul primit este corect (desi ar trebui sa para un text inteligibil) prin aplicarea MAC-ului CMAC cu AES-128-CBC peste ultimii 16 octeti din fisierul binar data_enc_mac.bin. Vedeti functia | ||
+ | <code> | ||
+ | openssl mac -cipher AES-128-CBC -binary | ||
+ | </code> | ||
+ | cu parametrul -macopt hexkey:... (aici km in hexa) | ||
+ | |||
+ | |||
+ | ==== Exercițiul 2+ ==== | ||
+ | |||
+ | Pentru al doilea exercitiu puteti folosi platforma Google Colab, accesând [[https://colab.research.google.com/github/ACS-IC-labs/IC-labs/blob/main/labs/lab08/lab8.ipynb|acest]] link. | ||
+ | |||
+ | <hidden> | ||
+ | |||
În acest laborator vom studia despre Message Authentication Codes (MAC). | În acest laborator vom studia despre Message Authentication Codes (MAC). | ||
Line 16: | Line 82: | ||
Ați putea încerca să spargeți securitatea algoritmului MAC folosind 2 query-uri. Cu toate acestea, puteți găsi o metodă să atacați algoritmul folosind doar un query? | Ați putea încerca să spargeți securitatea algoritmului MAC folosind 2 query-uri. Cu toate acestea, puteți găsi o metodă să atacați algoritmul folosind doar un query? | ||
</note> | </note> | ||
+ | </hidden> | ||
<hidden>==== Exercițiul 2 - Timing attack ==== | <hidden>==== Exercițiul 2 - Timing attack ==== | ||
Line 208: | Line 275: | ||
</file> | </file> | ||
</hidden> | </hidden> | ||
+ | <hidden> | ||
Line 249: | Line 317: | ||
</note> | </note> | ||
+ | </hidden> | ||
<hidden> | <hidden> | ||
<file python birthday.py> | <file python birthday.py> | ||
- | |||
- | import sys | ||
- | import string | ||
- | import base64 | ||
from Crypto.Hash import SHA256 | from Crypto.Hash import SHA256 | ||
+ | from random import randint | ||
+ | from collections import Counter | ||
def raw2hex(raw): | def raw2hex(raw): | ||
- | return raw.encode('hex') | + | return raw.hex() |
def hex2raw(hexstring): | def hex2raw(hexstring): | ||
- | return base64.b16decode(hexstring) | + | return bytes.fromhex(hexstring) |
hexdigits = '0123456789ABCDEF' | hexdigits = '0123456789ABCDEF' | ||
Line 269: | Line 335: | ||
def hash(message): | def hash(message): | ||
h = SHA256.new() | h = SHA256.new() | ||
- | h.update(message) | + | h.update(message.encode()) |
return h.digest() | return h.digest() | ||
- | |||
def main(): | def main(): | ||
# Try to find a collision on the first 4 bytes (32 bits) | # Try to find a collision on the first 4 bytes (32 bits) | ||
- | | + | |
# Step 1. Generate 2^16 different random messages | # Step 1. Generate 2^16 different random messages | ||
- | | + | |
# Step 2. Compute hashes | # Step 2. Compute hashes | ||
- | | + | |
# Step 3. Check if there exist two hashes that match in the first | # Step 3. Check if there exist two hashes that match in the first | ||
# four bytes. | # four bytes. | ||
- | | + | |
# Step 3a. If a match is found, print the messages and hashes | # Step 3a. If a match is found, print the messages and hashes | ||
- | | + | |
# Step 3b. If no match is found, repeat the attack with a new set | # Step 3b. If no match is found, repeat the attack with a new set | ||
# of random messages | # of random messages |