Készítsd el az affin rejtjel megvalósítását, amely egy ősi, a Közel-Keleten létrehozott titkosítási rendszer.
Az affin rejtjel a monoalfabetikus helyettesítő rejtjelek egyik fajtája. Minden karaktert hozzárendelünk a számértékéhez, egy matematikai függvénnyel titkosítunk, majd átalakítjuk az új számértékéhez tartozó betűvé. Bár minden monoalfabetikus rejtjel gyenge, az affin rejtjel sokkal erősebb az Atbas rejtjelnél, mert jóval több kulcsa van.
A titkosítás függvénye:
E(x) = (ai + b) mod m
Ahol:
i a betű indexe, amely 0-tól az ábécé hossza mínusz 1-ig terjed.m az ábécé hossza.
A latin ábécé esetében m értéke 26.a és b olyan egész számok, amelyek a titkosítási kulcsot alkotják.Az a és m értékének relatív prímnek kell lennie (más szóval egymáshoz képest prímnek), hogy az automatikus visszafejtés sikeres legyen, azaz csak az 1 a közös osztójuk (további információkat a relatív prím egészekről szóló Wikipédia-szócikkben találsz).
Ha a és m nem relatív prímek, a programod jelezze, hogy ez hiba.
Ellenkező esetben a megadott kulccsal titkosítson vagy fejtsen vissza.
A feladat szempontjából a számjegyek érvényes bemenetnek számítanak, de nem titkosítjuk őket.
A szóközöket és az írásjeleket kizárjuk.
A rejtjelszöveg rögzített hosszúságú, szóközzel elválasztott csoportokban íródik ki, a hagyományos csoportméret 5 betű.
Ezzel nehezebb a titkosított szöveget a szóhatárok alapján kitalálni.
A visszafejtés függvénye:
D(y) = (a^-1)(y - b) mod m
Ahol:
y egy titkosított betű számértéke, azaz y = E(x)
a^-1 az a mod m moduláris multiplikatív inverze (MMI)a és m relatív prímek.Az a MMI-je az az x, amelyre ax m-mel való osztásának maradéka 1:
ax mod m = 1
A moduláris multiplikatív inverz megtalálásáról és jelentéséről bővebben a kapcsolódó Wikipédia-szócikkben olvashatsz.
"test" titkosítása a = 5, b = 7 kulccsal "ybty"."ybty" visszafejtése a = 5, b = 7 kulccsal "test"."ybty" visszafejtése a hibás a = 11, b = 7 kulccsal "lqul"."kqlfd jzvgy tpaet icdhm rtwly kqlon ubstx" visszafejtése a = 19, b = 13 kulccsal "thequickbrownfoxjumpsoverthelazydog"."test" titkosítása a = 18, b = 13 kulccsal hiba, mert 18 és 26 nem relatív prímek.Az MMI megtalálása a = 15 esetén:
(15 * x) mod 26 = 1(15 * 7) mod 26 = 1, azaz 105 mod 26 = 1
7 a 15 mod 26 MMI-je.Néha szükség lehet arra, hogy kivételt dobj. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, ami megmutatja, mi a hiba forrása. Ettől olvashatóbb lesz a kódod, és sokat segít a hibakeresésben is. Ha tudod, hogy a hiba forrása egy adott típusú lesz, választhatsz a beépített hibatípusok közül, de ilyenkor is adj meg beszédes üzenetet.
Ez a feladat megköveteli, hogy a raise utasítással „dobj” egy ValueError-t. A tesztek csak akkor lesznek sikeresek, ha raise-elsz egy exception-t, és üzenetet is fűzöl hozzá.
Ha üzenettel szeretnél ValueError-t dobni, írd az üzenetet az exception típus argumentumaként:
raise ValueError("a and m must be coprime.")
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.