Vissza

10. labor

  1. Válasszunk véletlenszerűen két, legalább 512 bites prímszámot, majd határozzuk meg az RSA publikus és privát kulcsokat. Írjuk ki külön állományba a publikus kulcs base64-es alakját, egy másikba a privát kulcs base64-es alakját. Vegyünk egy tetszőleges ASCII nyomtatható karaktereket tartalmazó szöveget és titkosítsuk valamely állományból beolvasott publikus kulccsal. A titkosított szöveget hexadecimális formában írassuk ki a képernyőre, majd fejtsük vissza a rejtjelezett szöveget.

  2. Írjunk egy Python programot, amelyben az RSA digitális aláírás algoritmusait implementáljuk:
  3. Ugyanaz a szöveg, háromszor volt rejtjelezve textbook RSA-val, ahol adottak az (3, n1), (3, n2), (3, n3) nyilvános kulcsok. Az n1, n2, n3 értékek a modE3.txt állomány első három sorában találhatóak, ilyen sorrendben. A megfelelő rejtjelezett szövegek az cryptE3_1, cryptE3_2, cryptE3_3 állományokban találhatóak. Határozzuk meg az eredeti szöveget.

    Útmutatás: Olvassuk be a rejtjelezett szövegek bájtjait, alakítsuk át a bájtokból álló 256-os számrendszerbeli számokat 10-es számrendszerbe. Ezután alkalmazható a kínai maradéktétel, ugyanis feltételezve, hogy az eredeti szövegnek megfelelő szám a nr, és a rejtjelezett szövegeknek megfelelő számok a c1, c2, c3 megállapítható:
    x = nre mod n1 → x = c1 mod n1
    x = nre mod n2 → x = c2 mod n2
    x = nre mod n3 → x = c3 mod n3
    Ha meghatározzuk a baloldali egyenletrendszerből az x-et, akkor köbgyököt vonva visszanyerhető a nr, mert x = nr3 mod (n1·n2·n3).

    Az x köbgyökének a meghatározásához használhatjuk a következő kódsort:
    import decimal
    decimal.getcontext().prec = 100
    tmp = math.ceil(pow(x, 1/decimal.Decimal(3)))

  4. Írjunk Python programot, amely meghatározza a következő r egyenletből álló kongruencia-rendszer legkisebb megoldását, feltételezve, hogy az m1, m2,…, mr pozitív egész számok páronként relatív prímek.
    x = a1 mod m1
    x = a2 mod m2
    ...
    x = ar mod mr

  5. Az RSA-textbook kriptorendszer visszafejtésének időigényét gyorsítani lehet, ha alkalmazzuk a kínai maradéktételt. Írjunk Python programot, amelyben összehasonlítjuk a két visszafejtési algoritmus időigényét.

  6. Írjunk függvényt, amely meghatározza két "nagy" szám: X, Y összegét. Feltételezzük, hogy a gépszó hosszúsága nem nagyobb mint, H és X, Y egyike sem nagyobb, mint M, ahol természetesen H jóval kisebb, mint M. Pédául ha H = 100, akkor M = 106, egy lehetséges választás
    Először kiválasztjuk az m1, m2,..., mk értékeket, úgy hogy m1 · m2· ...· mk >= M, és m1, m2, ..., mk mindegyike kisebb legyen, mint H, és páronként relatív prímek legyenek, ahol az m1, m2,..., mk értékeket választhajuk prímeknek is. Meghatározzuk a következő kongruenciákat:
    x1 = X mod m1, y1 = Y mod m1
    x2 = X mod m2, y2 = Y mod m2
    ...
    xk = X mod mk, yk = Y mod mk
    majd a Kínai maradéktétellel megoldjuk a következő rendszert, ahol a kapott z érték, az X és Y összegét fogja jelenteni:
    z = x1 + y1 mod m1,
    z = x2 + y2 mod m2,
    ...
    z = xk + yk mod mk,
    Határozzuk meg abban a sajátos esetben is, a két "nagy" szám: X, Y összegét, ha m1 = 2i1-1, m2 = 2i2-1,..., mk = 2ik-1, ahol k egy pozitív egész szám.