9. vaje: KODIRANJE (04.05. - 11.05.)

Napišite program za kodiranje besedila s pomočjo šifrirnih algoritmov.

Cezarjev alogritem je eden od najpreprostejših načinov šifriranja. Gre za zamenjavo črk, kjer orginalno črko zamenjaš s črko, ki je bila v abecedi nekaj mest za njo. Postopek lahko opišemo kot zamenjavo črk a → a+k po modulu n (n pomeni število črk v abecedi), “k” predstavlja ključ.

XOR kodiranje je algoritem za simetrično šifriranje, ki skrije podatke s pomočjo bitnega operatorja XOR. Operator XOR se v programskem jeziku java označi kot znak ^. Kodiranje podatkov poteka tako, da se posamezen bajt XOR-a z vsakim znakom iz gesla na način, da se  i-ti znak besedila XOR-a z i-tim znakom gesla. Ker so gesla ponavadi krajša kot besedilo, so indeksi ključa vzeti po modulu n (n = dolžina gesla).
Formula za enkripcijo: 
zakodirano[i] = niz[i] ^ kljuc[i % kljuc.length]
Formula za dekripcijo: 
odkodirano[i] = zakodirano[i] ^ kljuc[i % kljuc.length]

1.) Napišite vmesnik Kodirnik, ki opisuje kodiranje, v njem pa sta definirani metodi String enkripcija(String besedilo) in String dekripcija(String besedilo).

2.) Napišite razred CezarjevAlgoritem, ki implementira razred Kodirnik in v njem smiselno definira metodi enkripcija in dekripcija.
a.) Implementirajte konstruktor CezarjevAlgoritem(int zamik), ki nastavi ključ oziroma zamik, s katerim želimo šifrirati besedilo. Upoštevajte, da je lahko zamik tudi negativen.
b.) Implementirajte metodo String enkripcija(String besedilo), ki šifrira besedilo s predhodno podanim zamikom.
c.) Implementirajte metodo String dekripcija(String besedilo), ki odšifrira besedilo. 

3.) Napišite razred XOR, ki naj implementira razred Kodirnik in v njem smiselno definira metodi enkripcija in dekripcija.
a.) Implementirajte konstruktor XOR(String ključ), ki nastavi ključ, s katerim želimo šifrirati besedilo.
b.) Implementirajte metodo String enkripcija(String besedilo), ki šifrira besedilo s predhodno podanim ključem.
c.) Implementirajte metodo String dekripcija(String besedilo), ki odšifrira besedilo.

4.) Napišite razred Kodiranje in v njem:
a.) statično metodo String preberiIzDatoteke(String imeDatoteke), ki prebere vsebino datoteke (ime datoteke je podano v prvem argumentu).
b.) statično metodo void zapisiVDatoteko(String sporočilo, String imeDatoteke), ki zapiše vsebino datoteke v ciljno datoteko (vsebina datoteke je podana v prvem argumenu, ime datoteke v drugem argumentu).
c.) statično metodo main(), ki zakodira in zapiše rezultate kodiranja vseh kodirnikov v datoteko.

Primer delovanja programa za Cezarjev Algoritem:
String originalnoBesedilo = preberiIzDatoteke(vir);
Kodirnik cezar = new CezarjevAlgoritem(4);
String kodiranoBesedilo = cezar.enkripcija(originalnoBesedilo);
String dekodiranoBesedilo = cezar.dekripcija(kodiranoBesedilo);
zapisiVDatoteko(kodiranoBesedilo, "viri/cezar.txt");