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:16] – 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. | + | 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čina rada. | + | 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, | Dostupan ti je ciphertext, djelomični plaintext te program koji se koristio za šifriranje poruke, | ||
| ali ne i tajni AES ključ. | ali ne i tajni AES ključ. | ||
| Line 138: | Line 138: | ||
| 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 149: | Line 150: | ||
| 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: | ||
| Line 187: | Line 185: | ||
| </ | </ | ||
| - | 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. | ||
| - | **TODO: OVO TREBA PRIKAZATI BOLJE** | + | 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 | ||
| + | |||
| + | |||
| + | |||
| + | |||
aes.1737476171.txt.gz · Last modified: 2025/12/01 11:40 (external edit)