|
Titkosítás
Amint az ajtó kitárult, kommandós osztagként hatoltatok be a
terroristák titkos főhadiszállására. Ám ott megdöbbenve vettétek észre,
hogy néhány pizzás dobozon és üres üdítőitalos flakonon (hey...legalább
50 forint, szóval már megérte!) kívül semmi nincs ott. A terroristák
valószínűleg már napokkal korábban elhagyták a helyszínt és igyekeztek
minden nyomot eltűntetni maguk után ami az esetleges új rejtekhelyükre
utalna. Azonban az egyik pizzás doboz alján észrevettetek valamilyen
furcsa titkosírást, mely talán segíthet a nyomozásban. A ti feladatotok
lesz feltörni azt!
Input
A bemenet két, sor vége karakterrel lezárt sorból áll:
- Az első sor egy tetszőlegesen hosszú string, mely a titkosított szöveget
tartalmazza. A string az angol ABC kis- és nagybetűiből,
illetve a szóköz karakterből áll (összesen 53 lehetséges
karakter).
- A második sor a már említett 53 karakterből tartalmaz 4-et,
szóközzel elválasztva.
Output
A kimenet egyetlen sor, mely a titkosítatlan szöveget adja meg.
Szabályok
A titkosított (input) szöveg elkészítése az alábbiak szerint zajlott:
- Az 53 lehetséges karaktert az
a=0,b=1,...,z=25,A=26,B=27,...,Z=51," "=52 módon számozzuk.
- Az inputként megadott titkosított szöveg minden karaktere úgy
készült, hogy az ismeretlen üzenet minden karakterét (számként)
megszoroztuk ugyanazzal a K
számmal, majd hozzáadtuk ugyanazt az
L számot. Ezt követően az így kapott
n számot modulo 53 redukáltuk (programozásban:
n%53)
Példa: ha K=3 és L=4, úgy az x=23 számból 3*23 + 4
= 73%53 = 20 = "u" lesz.
Az input első sorában lévő titkosított szövegből visszakapni az eredeti
szöveget (ami a szükséges output) az alábbiak szerint tudjuk:
- A titkosított (input) szöveg minden karakteréből (számként)
levonjuk L értékét.
- Az így kapott számot "osztjuk" K-val.
Azonban mivel minden művelet egész számokkal zajlik 0-tól
52-ig, így az osztás nem a hagyományos osztás. A "moduláris
osztás" úgy zajlik, hogy megkeressük azt a K'
számot, melyre teljesül az, hogy (K*K')%53 = 1. Ezt követően a
K-val való osztás ekvivalens az ezzel a K' számmal való
szorzással, redukálva
modulo 53 (programozásban %53).
Példa: a fenti példa esetén "u=20"-ból úgy kapjuk
vissza a kiindulási "x"-et, hogy:
- "u" - L = 20-L = 16
- K' = 18, mert (K*K')%53 = (3*18)%53 = 54%53 = 1
- Így ((20-L)*18)%53 = (16*18)%53 = 288%53 = 23 = "x"
A probléma a fenti algoritmussal, hogy K és
L értéke nem ismert a feladat során. Ellenben az input második
sora segítségével kiszámolható!
- Az input második sora négy karaktert tartalmaz, melyek
megadnak 2 titkosítatlan-titkosított betűpárt.
- Így például a "h n A z" sor azt jelenti,
hogy a titkosítatlan "h" karakter párja a
titkosított "n" karakter és a
titkosítatlan "A" karakter párja a
titkosított "z" karakter.
- Ezen információ segítségével "egyenletrendszerként"
kiszámolható a K és L értéke, hisz a titkosítás lényegében K*x
+ L = y elven történik ahol x és y a titkosítatlan-titkosított
betűpár és K és L az ismeretlenek. Mivel a feladatban két
titkosítatlan-titkosított betűpárt kapunk és pont két
ismeretlenünk van, így az egyenletrendszer megoldható. Az egyetlen nehézséget az
okozza, hogy most minden számolás modulo 53 történik, de az
osztás kivételével (ld. fent) minden művelet ugyanúgy zajlik,
mint a hagyományos egészek körében. Egyszerűen a végeredményt
kell %53-al reduálni.
Példa
|
|