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 11:15] – 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 25: | Line 25: | ||
| - hash(x2) = y | - hash(x2) = y | ||
| + | Konkretno potrebno je pronaći unos koji nije jednak vrijednosti " | ||
| Pronalazak rješenja jest zapravo vrlo jednostavan jednom kada se sazna da je riječ o | Pronalazak rješenja jest zapravo vrlo jednostavan jednom kada se sazna da je riječ o | ||
| Line 32: | Line 33: | ||
| Pretragom te DELTA vrijednosti, | Pretragom te DELTA vrijednosti, | ||
| - | Ključan dio koda jest sljedeći: | + | U kodu se koristi TEA kao hash algoritam tako da se konstantne vrijednosti " |
| - | <code python> | + | Istraživanjem javno poznatih napada na TEA algoritam, moguće je pronaći |
| - | v0, v1 = constants[0], constants[1] | + | |
| - | k0, k1, k2, k3 = k | + | |
| - | sum_val = 0 | + | Tekst " |
| - | for _ in range(32): | + | <file> |
| - | sum_val = (sum_val + DELTA) & 0xFFFFFFFF | + | 01100110 01101100 01100001 01100111 |
| - | v0 = (v0 + (((v1 << 4) + k0) ^ (v1 + sum_val) ^ ((v1 >> 5) + k1))) & 0xFFFFFFFF | + | 01100110 01101100 01100001 01100111 |
| - | v1 = (v1 + (((v0 << 4) + k2) ^ (v0 + sum_val) ^ ((v0 >> 5) + k3))) & 0xFFFFFFFF | + | 01100110 01101100 01100001 01100111 |
| - | + | 01100110 01101100 01100001 01100111 | |
| - | v = hex(v0).split(" | + | </file> |
| - | v = v.zfill(16) | + | |
| - | + | ||
| - | return v | + | |
| - | </code> | + | |
| - | + | ||
| - | TODO: ovdje opisati kako se može riješiti na script kiddie način | + | |
| - | + | ||
| - | 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. | + | |
| + | Bit-flipom najviših bitova svih 32-bitnih riječi dobivamo: | ||
| + | < | ||
| + | 11100110 01101100 01100001 01100111 | ||
| + | 11100110 01101100 01100001 01100111 | ||
| + | 11100110 01101100 01100001 01100111 | ||
| + | 11100110 01101100 01100001 01100111 | ||
| + | </ | ||
| - | Ranjivost algoritma proizlazi iz F funkcije s obzirom da se radi o operacijama zbrajanja i xoranja. | + | Zadatak prihvaća tekst u base64 kodiranom formatu, pa možemo koristiti [[https://gchq.github.io/ |
| - | 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/const2 na poziciji n. | + | |
| - | 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 i u drugom | + | |
| - | članu xor operacije. S obzirom | + | |
| - | (odnosno može jer nam je dan " | + | |
| - | po svakoj iteraciji | + | |
| - | 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 " | + | Zadatak pokazuje kako je bitno istražiti javno poznate napade na kriptografske algoritme, budući da je često moguće uspješno izvesti napad i bez matematičkog razumijevanja ranjivosti. |
tea.1737544547.txt.gz · Last modified: 2025/12/01 11:40 (external edit)