Kriptográfiai algoritmusok

Hash számítás

Áttekintés

  • Mi jellemzi a hash függvényeket?
  • Hol, és mire használják őket?

MD5 Hash

  • Message Digest
  • RFC 1321, 1992.
  • 512 bit \(\rightarrow\) 128 bit

Algoritmus

Biztonság

Az MD5 hash manapság már nem tekinthető biztonságos hash-nek! (Integritás ellenörzésre továbbra is kiválóan alkalmas.)

Biztonságos hash, SHA, SHA-2

  • SHA: Secure Hash Algorithm
  • Többségében az NSA (National Security Agency) fejlesztette ki őket.
  • SHA-2: Az SHA-256 és az SHA-512 a leginkább elterjedt.

Paraméterek

Hasonlítsuk össze az SHA-256 és az SHA-512 fő paramétereit!

Alkalmazási területek

  • SSL (Secure Socket Layer)
  • TLS (Transport Layer Security)
  • PGP (Pretty Good Privacy)

Paraméterek

Algoritmus

BCrypt, Argon2

Jelszavak tárolása

Szimmetrikus kulcsos titkosítás

Aszimmetrikus kulcsos titkosítás

RSA

  • RSA: Ron Rivest, Adi Shamir, Leonard Adleman, 1977.

Forrás

Miller-Rabin féle prímteszt

  • A Fermat-féle álprímteszthez hasonlóan csak valószínűsíti, hogy az adott egész szám prím-e.
  • Különböző egész értékek használhatók benne, így állítható a prímteszt erőssége.
  • Lényegesen kisebb a számítási igénye, mint ha végigpróbálgatnánk az összes osztót.
  • A gyakorlati felhasználás szempontjából kellő megbízhatóságot ad.

Forrás

Kérdések

  • Mi a különbség a hash és az ellenörzőösszeg között?
  • Hogyan kapcsolódik Alice és Bob az RSA-hoz?
  • Mitől véd, és mitől nem véd a só (salt) használata a jelszavak tárolásánál?

Feladatok

1. MD5 Hash

  • Ellenőrízzük az algoritmusban szereplő K konstans értékeket!
  • Vizsgáljuk meg, hogy hogy változnak a g értékek az iterációkban!
  • Vizsgáljunk meg kész C implementációkat!
  • Készítsünk egységteszteket a helyesség ellenörzéséhez!
  • Vizsgáljuk meg a bitenkénti forgatás (left rotate, right rotate) műveletek C-s implementációját!
  • Implementáljuk C-ben az algoritmust!
  • Készítsük el az OpenCL implementációt (amelyben a hash számítás egy számítási magon végezhető)!

2. SHA-256

  • Ellenőrízzük az algoritmusban a kiinduló (\(h_0, \ldots, h_7\)) hash értékeket!
  • Ellenőrízzük a k konstansok értékét!
  • Vizsgáljunk meg kész C implementációkat!
  • Készítsünk egységteszteket a helyesség ellenörzéséhez! (Használjuk fel hozzá például az üres sztring hash kódját.)
  • Implementáljuk C-ben az algoritmust!

3. Jelszó visszafejtés

Egy adatbázisban a users táblában a következő adatokat találtuk.

| name  | password                         |
+-------+----------------------------------+
| user1 | af5b3d17aa1e2ff2a0f83142d692d701 |
| user2 | 3e918e9c9f594bda6b0cf358391c3b1a |
| user3 | a3d11119e7c6af230e2dac2474ef2466 |
| user4 | bf4ab447496f2d3d5a6c77c2cd12f996 |
  • Az adatbázisban a jelszavak MD5 hash formájában kerültek tárolásra.
  • Tudjuk, hogy ASCII kódolású, csak számokat és betűket tartalmazó, pontosan 6 hosszúságú jelszavakról van szó.
  • Készítsünk egy OpenCL programot, amelyik segítségével "hatékonyan" visszafejthetjük a jelszavakat!
  • Vizsgáljuk meg a futási időt a szekvenciális változathoz képest!
  • Adjunk becslést a jelszó/másodperc értékére!

4. Prímtesztelés

  • Implementáljuk C-ben a Miller-Rabin prímtesztelő eljárást (például a determinisztikus változatot)!
  • Készítsük el az OpenCL-es változatát!
  • Végezzünk méréseket a számítási időre vonatkozóan!

5. Prímszámok generálása

  • Készítsünk olyan véletlenszám generátort, amelyik \(n\) bites prímszámokat tud generálni!
  • Az algoritmushoz válasszunk egy nagy, páratlan egész értéket, majd prímteszteléssel viszgáljuk meg, hogy egész-e!

6. RSA

  • Implementáljuk C-ben a moduláris hatványozást és a Kibővített Euklideszi algoritmust!
  • Készítsünk teszteseteket a helyesség ellenörzésére!
  • Implementáljuk az RSA algoritmust C-ben!
  • Legyen \((99, 19073827)\) a publikus kulcs. Ennek ismeretében próbáljuk meg kitalálni a privát kulcsot!