Diszkrét matematika 11. előadás Sapientia Egyetem, Műszaki és Humántudományok Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2016, őszi félév
Miről volt szó az elmúlt előadáson? legnagyobb közös osztó az eukleidészi algoritmus és változatai lineáris kongruenciák moduláris inverz az RSA titkosító, baby változat
Miről lesz szó? megjegyzések az előző előadáshoz: inverz függvény, videó, animáció megjegyzések a 6. labor 4-es feladatához az RSA szöveg, bájtsorozat titkosítása, baby változat legkisebb közös többszörös diofantoszi egyenletek a kínai maradéktétel
Az RSA, számpélda Kulcsgenerálás Legyen p = 61, q = 97 két prímszám. Meghatározzuk: n = 61 97 = 5917, φ = (p 1) (q 1) = 60 96 = 5760. Legyen e = 7, ahol lnko(7, φ) = 1. Meghatározzuk e inverzét (mod φ) szerint, kapjuk: d = 823, mert 7 823 = 1 (mod 5760). A nyilvános-kulcs : (7, 5917). A titkos-kulcs : (823, 5917). Titkosítás (bárki titkosíthat) Az x = 2014 értéket szeretnék titkosítani, ekkor a titkosított érték: cx = 2014 7 1526 (mod 5917). Visszafejtés (csak a titkos-kulcs birtokosa tud visszafejteni) x = 1526 823 2014 (mod 5917).
Az RSA, bájtsorozat titkosítása bájtsorozat: [0,255] közötti értékből álló sorozat, azaz 256-os számrendszerbeli számjegyeket tartalmazó sorozat, ezt fogjuk titkosítani az RSA algoritmus egy nagy számot titkosít: a bájtsorozatot át kell alakítani nagy számmá, azaz a 256-os számrendszerbeli számjegyeket át kell alakítani 256 l számrenszerbe, ahol l a bájtsorozat hossza az alakit, függvény, a bemeneti l hosszúságú stringet átalakítja egész számmá, (256-os számrendszerből alakít 256 l számrendszerbe), a string elemeire alkalmazzuk a ord() könyvtárfüggvényt, az valakit, függvény, egy egész számot átalakít egy l hosszúságú stringgé, (256 l -es számrendszerből alakít 256-os számrendszerbe), alkalmazzuk a chr() könyvtárfüggvényt.
Az RSA, szöveg-rejtjelező def alakit(szoveg, l): szam = 0 pr = 1 for i in range(l): temp = ord(szoveg[i]) szam += temp * pr pr = pr << 8 return szam def valakit(szam, l): szoveg = for i in range(l): temp = szam & 255 szoveg += chr(temp) szam = szam >> 8 return szoveg
Az RSA, szöveg-rejtjelező A feladat konstans kulcsokkal dolgozik, a kulcsgenerálás az előző előadáson volt tárgyalva. A függvény paramétere az a karakterlánc amit titkosítani szeretnénk. from random import randint import base64 def RSA_main (szoveg): k = 256 e = 3 p = 148569510378747575788228425143133393923 q = 118544365557834428591364998965090431971 n = p * q phi = (p-1) * (q-1) d = inverz(e, phi) l = len(szoveg) if l > k/8: print "nagyobb kulcs meret kell!" return print "encryption..." cszoveg = RSA_cryptS(e, n, l, k/8, szoveg) print "encrypted text: ", cszoveg print "encrypted text in base64: ",, base64.b64encode(cszoveg) print print "decryption..." nszoveg = RSA_decryptS(d, n, l, k/8, cszoveg) print "decrypted text: ", nszoveg
Az RSA, szöveg-rejtjelező def RSA_cryptS(e, n, l1, l2, szoveg): x = alakit (szoveg, l1) cx = pow (x, e, n) cszoveg = valakit (cx, l2) return cszoveg def RSA_decryptS(d, n, l1, l2, cszoveg): cx = alakit (cszoveg, l2) nx = pow(cx, d, n) nszoveg = valakit (nx, l1) return nszoveg
A legkisebb közös többszörös Az a és b egész számok legkisebb közös többszöröse, az a legkisebb szám amely osztható a-val és b-vel is. Jelölése: lkkt(a, b), vagy [a, b]. Kapcsolat a legnagyobb közös osztóval: (a, b) [a, b] = a b. Ha a = p a i i Ha a = p a i i Megjegyzések: és b = p b i i, akkor lnko(a, b) = p min{a i,b i } i. és b = p b i i, akkor lkkt(a, b) = p max{a i,b i } i. két szám prímtényezős felbontása alapján meghatározható, tehát a két szám legnagyobb közös osztója, legkisebb közös többszöröse nagy számok esetében, a prímtényezős felbontás meghatározására nem ismert hatékony eljárás, ekkor az eukleidészi algoritmust kell használni
Diofantoszi egyenletek 1. tétel egész együtthatós többismeretlenes algebrai egyenletek, amelyeknek megoldásai egész számok (ritkán természetes vagy racionális számok), elnevezése Diophantosz (3. század), görög matematikus után, csak elsőfokú kétismeretlenes diofantoszi egyenletekkel fogunk foglalkozni: a x + b y = c, Legyenek a, b egész számok, úgy hogy d = lnko(a, b). Az a x + b y = c egyenletnek nincs megoldása az egész számok körében, ha d nem osztja c-t. Ha d c, akkor az egyenletnek végtelen sok megoldása van: x = x 0 + (b/d) n, y = y 0 (a/d) n, ahol n egész szám és x 0, y 0 az egyenlet egy partikuláris megoldása.
Diofantoszi egyenletek, példa Egy elárusító 1676 ron értékben rendelt almát és körtét. Minden láda alma 36 ronba, és minden láda körte 50 ronba kerül. Hány láda almát és hány láda körtét rendelt? 1. megoldás: 16 láda almát és 22 láda körtét rendelt, 16 36 + 22 50 = 1676. 2. megoldás: 41 láda almát és 4 láda körtét rendelt, 41 36 + 4 50 = 1676. A megoldás menete: Meghatározzuk 36, 50 legnagyobb közös osztóját: d = 2. Megvizsgáljuk, hogy d = 2 osztja-e 1676-ot. A kiterjesztett eukleidészi algoritmussal meghatározzuk: x = 7, y = 5 értékeket: 7 36 + ( 5) 50 = 2. Megszorozzuk az egyenletet 1676 = 838 -cal. d Egy partikuláris megoldás x 0 = 5866, y 0 = 4190: 5866 36 4190 50 = 1676 a feladat megoldásához a pozitív megoldások kellenek
Diofantoszi egyenletek Keressük a pozitív megoldásokat, fenn kell álljon: 5866 + 50 d 4190 + 36 d n = 5866 + 25 n 0 n 234.64 n = 4190 18 n 0 n 232.7 n = 234 x 1 = 5866 + 25 ( 234) = 16 y 1 = 4190 18 ( 234) = 22 n = 233 x 2 = 5866 + 25 ( 233) = 41 y 2 = 4190 18 ( 233) = 4
Diofantoszi egyenletek, példa Egy elárusító 549 ron értékben rendelt almát és körtét. Minden láda alma 18 ronba, és minden láda körte 33 ronba kerül. Mennyi az a minimális ládaszám amit az elárusító rendelhetett? Megoldások: 25 láda alma és 3 láda körte, összesen 28 láda 14 láda alma és 9 láda körte, összesen 23 láda 3 láda alma és 15 láda körte, összesen 18 láda Az elárusító 18 láda gyümölcsöt rendelt.
Diofantoszi egyenletek A megoldás menete: Meghatározzuk 18 és 33 legnagyobb közös osztóját: d = 3. Megvizsgáljuk, hogy d = 3 osztja-e 549-et. A kiterjesztett eukleidészi algoritmussal meghatározzuk: x = 2, y = 1 értékeket: 2 18 + ( 1) 33 = 3. Megszorozzuk az egyenletet 549 = 183 - mal. d Egy partikuláris megoldás x 0 = 366, y 0 = 183. Keressük a pozitív megoldásokat, fenn kell álljon: 366 + 33 d 183 18 d n = 366 + 11 n 0 n 33.2 n = 183 6 n 0 n 30.5
Diofantoszi egyenletek n = 33 x 1 = 366 + 11 ( 33) = 3 y 1 = 183 6 ( 33) = 15 n = 32 x 2 = 366 + 11 ( 32) = 14 y 2 = 183 6 ( 32) = 9 n = 31 x 3 = 366 + 11 ( 31) = 25 y 3 = 183 6 ( 31) = 3 A minimumot az x 1 = 3, y 1 = 15 megoldás adja, ami összesen 18 ládát jelent.
Egy kétismeretlenes diofantikus egyenlet pozitív megoldásai from math import ceil, floor def diofant (a, b, c): (d, x, y) = exteuclid (a, b) if c % d <> 0: print "no solution" return x *= c/d y *= c/d bd = b/d ad = a/d n1 = int (ceil(-x / float(bd))) n2 = int (floor(y / float(ad))) for i in range(n1, n2 + 1): print x + bd * i, y - ad * i
A kínai maradéktétel Feladat: Ha egy tojásokkal teli kosárból kivesszük a tojásokat 2, 3, 4, 5, majd 6 -osával, akkor rendre 1, 2, 3, 4, 5 tojás marad mindig a kosárban. Ha 7-esével vesszük ki nem marad egy tojás sem. Hány tojás van a kosárban? A feladat az alábbi kongruencia rendszerrel modellezhető: Mi a fenti rendszer megoldása? x 1 (mod 2) x 2 (mod 3) x 3 (mod 4) x 4 (mod 5) x 5 (mod 6) x 0 (mod 7)
A kínai maradéktétel 2. tétel Legyenek m 1, m 2,..., m r pozitív, páronként relatív prímek. Ekkor az x a 1 (mod m 1) x a 2 (mod m 2). x a r (mod m r ) kongruencia rendszernek M = m 1 m 2... m r modulus szerint egy megoldása van. A megoldás meghatározásának menete: meghatározzuk: M k = M/m k = m 1 m 2... m k 1 m k+1... m r, meghatározzuk az M k értékek inverzét ˆM k -val, (mod m k ) szerint, jelöljük ezeket x = a 1 M 1 ˆM 1 + a 2 M 2 ˆM 2 +... + a r M r ˆM r lesz a rendszer megoldása.
A kínai maradéktétel A tojásos feladat az alábbi kongruencia rendszerre vezethető vissza: mert x 4 (mod 5) x 11 (mod 12) x 0 (mod 7) az x 3 (mod 4) egyenlet megoldásai kielégítik az x 1 (mod 2) egyenlet megoldásait, az x 5 (mod 6) egyenlet megoldásai kielégítik az x 2 (mod 3) egyenlet megoldásait, az x 11 (mod 12) egyenlet megoldásai kielégítik az x 3 (mod 4) és x 5 (mod 6) egyenletek megoldásait.
A kínai maradéktétel A megoldás menete: a 1 = 4, a 2 = 11, a 3 = 0, m 1 = 5, m 2 = 12, m 3 = 7, M = 420, M 1 = 84, M 2 = 35, M 3 = 60, ˆM 1 = 4, ˆM 2 = 11, ˆM 3 = 2, vegyük észre, hogy fennáll: M 1 ˆM1 = 1 (mod m 1) M 2 ˆM2 = 1 (mod m 2) M 3 ˆM3 = 1 (mod m 3) 84 4 = 1 (mod 5) 35 11 = 1 (mod 12) 60 2 = 1 (mod 7) x = 84 4 4 + 11 11 35 + 5 60 0 = 119 (mod 420).