tea
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tea [2025/01/22 12:37] – lss | tea [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 9: | Line 9: | ||
| Mirjana je osmislila novi hash algoritam koji se brzo izvodi i zauzima jako malo prostora. | Mirjana je osmislila novi hash algoritam koji se brzo izvodi i zauzima jako malo prostora. | ||
| Zna koliko je bitno testirati algoritme prije nego što ih se stavi u proizvod, | Zna koliko je bitno testirati algoritme prije nego što ih se stavi u proizvod, | ||
| - | pa te moli da testiraš postoje li praktični napadi protiv njega, | + | pa te moli da testiraš postoje li praktični napadi protiv njega. |
| - | konkretno za jako je bitno da algoritam nije ranjiv na " | + | Konkretno |
| napad (https:// | napad (https:// | ||
| Line 35: | Line 35: | ||
| U kodu se koristi TEA kao hash algoritam tako da se konstantne vrijednosti " | U kodu se koristi TEA kao hash algoritam tako da se konstantne vrijednosti " | ||
| - | Istraživanjem javno poznatih napada na TEA algoritam, moguće je pronaći [[https:// | + | Istraživanjem javno poznatih napada na TEA algoritam, moguće je pronaći [[https:// |
| - | Tekst " | + | Tekst " |
| < | < | ||
| - | 01100110 01101100 01100001 01100111 01100110 01101100 01100001 01100111 01100110 01101100 01100001 01100111 01100110 01101100 01100001 01100111 | + | 01100110 01101100 01100001 01100111 |
| + | 01100110 01101100 01100001 01100111 | ||
| + | 01100110 01101100 01100001 01100111 | ||
| + | 01100110 01101100 01100001 01100111 | ||
| </ | </ | ||
| - | Bit-flipom svih 32-bitnih riječi dobivamo | + | Bit-flipom |
| < | < | ||
| - | 11100110 01101100 01100001 01100111 11100110 01101100 01100001 01100111 11100110 01101100 01100001 01100111 11100110 01101100 01100001 01100111 | + | 11100110 01101100 01100001 01100111 |
| + | 11100110 01101100 01100001 01100111 | ||
| + | 11100110 01101100 01100001 01100111 | ||
| + | 11100110 01101100 01100001 01100111 | ||
| </ | </ | ||
| - | Zadatak prihvaća tekst u base64 kodiranom formatu | + | Zadatak prihvaća tekst u base64 kodiranom formatu, pa možemo koristiti [[https:// |
| - | + | Zadatak pokazuje | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | Ključan dio koda jest sljedeći: | + | |
| - | + | ||
| - | <code python> | + | |
| - | v0, v1 = constants[0], | + | |
| - | k0, k1, k2, k3 = k | + | |
| - | + | ||
| - | sum_val = 0 | + | |
| - | for _ in range(32): | + | |
| - | sum_val = (sum_val + DELTA) & 0xFFFFFFFF | + | |
| - | v0 = (v0 + (((v1 << 4) + k0) ^ (v1 + sum_val) ^ ((v1 >> 5) + k1))) & 0xFFFFFFFF | + | |
| - | v1 = (v1 + (((v0 << 4) + k2) ^ (v0 + sum_val) ^ ((v0 >> 5) + k3))) & 0xFFFFFFFF | + | |
| - | + | ||
| - | v = hex(v0).split(" | + | |
| - | v = v.zfill(16) | + | |
| - | + | ||
| - | return v | + | |
| - | </ | + | |
| - | + | ||
| - | TODO: ovdje opisati | + | |
| - | + | ||
| - | TODO: Nakon tog objasniti zašto to radi | + | |
| - | + | ||
| - | k0,k1,k2 i k3 su 32-bitni dijelovi inputa koji je uvijek duljine 16 bajta (padding u slučaju da nije). | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | Runde TEA algoritma mogu biti opisane sljedećim pseudokodom (runde su iteracije): | + | |
| - | Yi+1 ← Yi + Fi(Zi, K0, K1); Zi+1 ← Zi + Fi(Yi+1, K2, K3); | + | |
| - | a opis F funkcije: | + | |
| - | Fi(z, k, k′) = (ShiftLeft(z, | + | |
| - | gdje bi Y i Z varijable odgovarale v0 i v1. | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | Ranjivost algoritma proizlazi iz F funkcije s obzirom da se radi o operacijama zbrajanja i xoranja. | + | |
| - | Sjetimo se da je cilj zadatka pronaći dva inputa koja daju isti output. Kada bi se funkcija navela | + | |
| - | da su outputi na svakoj iteraciji " | + | |
| - | također bio isti. S obzirom da je output isti u svakoj iteraciji član (z + Ci) se može zanemariti. Ci je sum_val | + | |
| - | koji ne ovisi o inputu, a z jest v0/v1 koji se mijenjaju s obzirom na output funkcije F, ali jer smo | + | |
| - | outpute funkcije F fiksirali na iste vrijednosti u oba slučaja po iteraciji, one se isto mogu gledati kao konstante (od nulte | + | |
| - | iteracije počinju od iste vrijednosti). Isto se može primijeniti i na ShiftLeft i ShiftRight funkcije. | + | |
| - | Stoga gledamo sljedeću funkciju: | + | |
| - | Fi(z, k, k′) = (const1 + k) ⊕ (const2 + k') | + | |
| - | Može li se izmjenom barem jednog bita u " | + | |
| - | i const2) kao i s originalnim vrijednostima " | + | |
| - | stoga to mora biti moguće kroz operaciju xor. Na poziciji " | + | |
| - | članu se također mora izmijeniti bit kako bi xor ostao isti. Međutim, zbrajanje na razini bitova ima tranzitivno svojstvo, odnosno prijenos. | + | |
| - | Ako se bit izmijeni može nastati (ne)prijenos i time izmijeniti sljedeći bit. Hoće li se prijenos dogoditi ovisi o vrijednosti const1/ | + | |
| - | Ukoliko je na poziciji " | + | |
| - | se neće dogoditi prijenos ako je 1 izmijenjena u 0. U oba slučaja izmijeni se i bit (ili više njih) na višim pozicijama što onda treba biti popraćeno | + | |
| - | članu xor operacije. S obzirom da se const vrijednosti dinamički mijenjaju kroz iteracije, ne može se predvidjeti kada će se 1 pojaviti na izmijenjenoj poziciji | + | |
| - | (odnosno može jer nam je dan " | + | |
| - | po svakoj iteraciji što za ovaj ključ nije slučaj). Svejedno, problem se može zaobići na vrlo jednostavan način. Prijenos se ne događa na najvišem bitu. Stoga, ako se | + | |
| - | bitovi na najvišoj poziciji izmijene unutar oba ključa " | + | |
| - | vrijednostima " | + | |
| - | + | ||
| - | Imajući navedeno na umu, zadatak ima 3 rješenja. Komplementiraju se najviši bitovi u " | + | |
tea.1737549437.txt.gz · Last modified: 2025/12/01 11:40 (external edit)