User Tools

Site Tools


aes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
aes [2025/01/21 16:00] lssaes [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 35: Line 35:
  
 **2) CBC (Cipher Block Chaining)** **2) CBC (Cipher Block Chaining)**
-  * Svaki blok jasnog teksta se XOR-a sa skrivenim tekstom prošlo kruga enkripcije+  * Svaki blok jasnog teksta se XOR-a sa skrivenim tekstom prošlog kruga enkripcije
   * Potreban je inicijalizacijski vektor IV koji se mora izabrati nasumično   * Potreban je inicijalizacijski vektor IV koji se mora izabrati nasumično
   * IV se šalje zajedno sa skrivenim tekstom    * IV se šalje zajedno sa skrivenim tekstom 
Line 127: Line 127:
  
 <file> <file>
-Mnogi od vas već znaju AES ECB način rada nesiguran. Zato smo odlučili šifrirati tajnu poruku koristeći AES CTR načina rada. Dostupan ti je ciphertext, djelomični plaintext te program koji se koristio za šifriranje poruke, ali ne i tajni AES ključ.+Mnogi od vas već znaju da je AES ECB način rada nesiguran.  
 +Zato smo odlučili šifrirati tajnu poruku koristeći AES CTR način rada.  
 +Dostupan ti je ciphertext, djelomični plaintext te program koji se koristio za šifriranje poruke,  
 +ali ne i tajni AES ključ.
  
 Možeš li dešifrirati poruku? Možeš li dešifrirati poruku?
Line 134: Line 137:
 Ideja zadatka jest pronaći ranjivost u AES implementaciji s CTR načinom rada. Ideja zadatka jest pronaći ranjivost u AES implementaciji s CTR načinom rada.
 CTR način rada jest definiran sljedećom formulom za enkripciju: CTR način rada jest definiran sljedećom formulom za enkripciju:
- C = P AES(key,CTR) + C = P ⊕ AES(key,CTR) 
-gdje je C ciphertext, P plaintext, a CTR kombinacija noncea countera (u implementaciji nonce[i]^counter). AES funkcija vraća +gdje je C ciphertext, P plaintext, a CTR kombinacija nonce vrijednosti (neka nasumična vrijednost) brojača (u našoj implementaciji su kombinirani pomoću XOR operacije). Funkcija AES ovdje ne šifrira sam plaintext, nego CTR vrijednost koja se zatim XOR-s plaintextomRezultat funkcije AES(key,CTRzovemo **keystream**. 
-keystream (tjključ za tu specifičnu iteraciju). AES ne procesuira cijeli plaintext odjednom već radi u blokovima od 16 bajtova. Prvi ciphertext+ 
 + Ne šifrira se cijeli plaintext odjednom već se radi u blokovima od 16 bajtova. Prvi ciphertext
 blok jest veličine 16 te je nastao xoranjem keystreama (za prvu iteraciju) s prvim blokom (također 16 bajtova) plaintexta, drugi ciphertext xoranjem keystreama blok jest veličine 16 te je nastao xoranjem keystreama (za prvu iteraciju) s prvim blokom (također 16 bajtova) plaintexta, drugi ciphertext xoranjem keystreama
 (za drugu iteraciju) s drugim blokom plaintexta itd... (za drugu iteraciju) s drugim blokom plaintexta itd...
Line 145: Line 149:
 dekripciju te se također nikada ne mijenja. AES je funkcija koja interno ne koristi randomizirane vrijednost jer dekripcija ne bi bila moguća. dekripciju te se također nikada ne mijenja. AES je funkcija koja interno ne koristi randomizirane vrijednost jer dekripcija ne bi bila moguća.
 Proces dekripcije je opisan sljedećom formulom (suprotan proces od enkripcije): Proces dekripcije je opisan sljedećom formulom (suprotan proces od enkripcije):
- P = C AES(key,CTR)+ P = C ⊕ AES(key,CTR) 
 Dakle, kako bi dekripcija bila moguća, za isti broj iteracije enkripcije i dekripcije koristi se isti keystream. Dakle, kako bi dekripcija bila moguća, za isti broj iteracije enkripcije i dekripcije koristi se isti keystream.
  
-Unutar zipa dan je algoritam za enkripciju, cijeli ciphertext te parcijalni plaintext. Unutar plaintexta ispisan je Lorem ipsum te se na kraju nalazi tekst "Zastavica je". +U ZIP datoteci priloženoj uz zadatak dan je algoritam za enkripciju, cijeli ciphertext te parcijalni plaintext. Proučavanjem ciphertext datoteke vidimo da se ciphertext sastoji od 4160 bajtova (260 blokova), a u plaintext datoteci se nalazi 4138 bajtovaBudući da se jedan blok sastoji od 16 bajtovamožemo zaključiti da 
-Kako bi se pronašao flag potrebno je dekriptirati blok iz ciphertexta u kojem je nalazio u cjelovitom plaintextu. Ispis "stat partial_plaintext.txt" vraća da je veličina +imamo cijeli plaintext do 257. bloka (bitno je zapamtiti da brojimo od nule!) pola 258. blokaa uopće nemamo 259. blok.
-datoteke 4138 bajtova, što je 16*258.625, odnosno 259 AES blokova (gdje je zadnji parcijalan). Ispis naredbe "grep -bo -f partial_plaintext.txt -e 'Zastavica je'" vraća "4124:Zastavica je". +
-Duljina "Zastavica je " jest 13stoga zaključujemo da zastavica započinje na indexu 4137 što je unutar 259. bloka. Jer je sveukupna veličina datoteke 4138a zastavica nije duljine 2 bajta +
-unutar parcijalne datoteke nedostaje 260. blok.+
  
-Do rješenja se dolazi tako da se dekriptira 259. 260. blok ciphertexta. Jedini način na koji se ti blokovi mogu dekriptirati jest ako se pronađe keystream za njihove iteracijeJer counter +Dakle, moramo pronaći način da dešifriramo 258. i 259. blok ciphertexta.
-počinje od 0, to će onda biti iteracije s counterom 258 i 259.+
  
 Kod za enkripciju unutar encrypt.c jest sljedeći: Kod za enkripciju unutar encrypt.c jest sljedeći:
  
 +<file>
  AES_EncryptInit(&ctx, key);   AES_EncryptInit(&ctx, key); 
            
Line 182: Line 183:
  
      output("\nEncrypted: 0x", ciphertext, (4160));      output("\nEncrypted: 0x", ciphertext, (4160));
 +
 +</file>
 +
 +Ranjivost implementacije je u tome da se za varijablu brojača (//counter//) koristi tip podatka char . Char jest veličine bajt, odnosno prima vrijednosti 0-255. 
 +
 +Zbog toga, nakon vrijednosti 255 inkrementiranjem nastaje [[integer|integer overflow]] te se vrijednost resetira na 0. To znači da je counter za iteraciju 258/259 zapravo 2/3 što onda znači da je keystream za navedene parove iteracija isti.
 +
 +Budući da imamo ciphertext i parcijalni plain text, moguće je doći do keystreama po formuli:
 + C ⊕ P = AES(key,CTR)
 +
 +U nastavku se prikazuje postupak kojim se dolazi do rješenja, bitno je zapamtiti da brojač počinje od nule!
 +
 + plaintext[2] ⊕ ciphertext[2] = keystream [2]
 + keystream[258] = keystream[2] // zbog integer overflowa, keystream kojim se šifrirao 258. blok jednak je onom kojim se šifrirao 2. blok
 + plaintext[258] = keystream[258] ⊕ ciphertext[258] // ovako dobivamo plaintext 258. bloka
 +
 + // zatim ponovimo postupak za 259. blok
 +
 + plaintext[3] ⊕ ciphertext[3] = keystream [3]
 + keystream[259] = keystream[3] // zbog integer overflowa, keystream kojim se šifrirao 259. blok jednak je onom kojim se šifrirao 3. blok
 + plaintext[259] = keystream[259] ⊕ ciphertext[259] // ovako dobivamo plaintext 259. bloka
 +
 +
 +
  
  
-Ranjivost implementacije zamaskirana je u primitivnom tipu countera. Char jest veličine bajt, odnosno prima vrijednosti 0-255. Zbog toga, nakon vrijednosti 255 inkrementiranjem 
-nastaje integer overflow te se vrijednost resetira na 0. To znači da je counter za iteraciju 258/259 zapravo 2/3 što onda znači da je keystream za navedene parove iteracija isti. 
-Jer nam je dan rezultat ciphertexta te imamo parcijalni plain text, moguće je doći do keystreama: 
- C ^ P = AES(key,CTR) 
-Za iteraciju 2/258 xoraju se 3. blokovi ciphertexta i plaintexta. Za iteraciju 3/259 4. blokovi. Jednom kada se keystream dobije, sve što je preostalo jest xorati ciphertext 
-259 i 240. bloka s odgovarajućim keystreamovima kako bi se dobili njihovi plaintextovi. 
    
  
aes.1737475238.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki