aes
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| aes [2025/01/21 16:00] – lss | aes [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: | ||
| < | < | ||
| - | 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, | + | C = P ⊕ AES(key, |
| - | gdje je C ciphertext, P plaintext, a CTR kombinacija | + | gdje je C ciphertext, P plaintext, a CTR kombinacija |
| - | keystream (tj. ključ za tu specifičnu iteraciju). AES ne procesuira | + | |
| + | 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, | + | P = C ⊕ AES(key, |
| 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. | + | U ZIP datoteci priloženoj uz zadatak |
| - | Kako bi se pronašao flag potrebno je dekriptirati blok iz ciphertexta u kojem je nalazio u cjelovitom plaintextu. Ispis "stat partial_plaintext.txt" | + | imamo cijeli plaintext do 257. bloka (bitno |
| - | datoteke | + | |
| - | Duljina " | + | |
| - | unutar parcijalne datoteke nedostaje 260. blok. | + | |
| - | Do rješenja se dolazi tako da se dekriptira 259. i 260. blok ciphertexta. Jedini | + | Dakle, moramo pronaći način |
| - | 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: | ||
| + | < | ||
| AES_EncryptInit(& | AES_EncryptInit(& | ||
| | | ||
| Line 182: | Line 183: | ||
| output(" | output(" | ||
| + | |||
| + | </ | ||
| + | |||
| + | Ranjivost implementacije je u tome da se za varijablu brojača (// | ||
| + | |||
| + | 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, | ||
| + | |||
| + | 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, | ||
| - | 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)