You are on page 1of 23

Tekstualne datoteke

Auditorne vježbe
Primjer 1 – Vigenéreova šifra

 ULAZ: Datoteka, prirodni broj N i polje prirodnih brojeva K od N kojih je svaki broj
između 0 i 127.
 IZLAZ: Enkriptirana datoteka Vigenéreovom šifrom i korištenjem ključa K duljine
N.

Prof. dr. sc. Alen Lovrenčić Page 2


Primjer 1 – Vigenéreova šifra

 Vigenéreova šifra
 Ova je šifra poopćenje Cezarove šifre.
 Uzima se ključ K od N prirodnih brojeva, te se 0-to slovo rotira za K[0] karaktera,
prvo slovo za K[1] karakter i tako do N-1 slova. N-to se slovo opet rotira za K[0],
(N+1)-vo za K[1] itd.

Prof. dr. sc. Alen Lovrenčić Page 3


Primjer 1 – Vigenéreova šifra

1. Ispiši izbornik
2. Učitaj izbor
3. Ako je izbor = 1 radi
4. Učitaj ime datoteke
5. Otvori datoteku za čitanje
6. Učitaj ime kriptoteksta
7. Otvori kriptotekst za pisanje
8. Učitaj duljinu ključa
9. Odredi ključ
10. Kriptiraj tekst
11. Vrati ključ kriptiranja
12. Ako je izbor = 2
13. Učitaj ime kriptoteksta
14. Otvori kriptotekst za čitanje
15. Učitaj ime datoteke
16. Otvori datoteku za pisanje
17. Učitaj Duljinu ključa
18. Učitaj ključ
19. Dekriptiraj tekst
20. inače izađi iz programa

Prof. dr. sc. Alen Lovrenčić Page 4


Primjer 1 – Vigenéreova šifra

 Organizacija podataka
 Ključ ćemo čuvati u polju. Kako se brojevi koji određuju ključ biraju
između 0 i 127, dovoljno je da to polje bude tipa char.

Prof. dr. sc. Alen Lovrenčić Page 5


Primjer 1 – Vigenéreova šifra

 Šifrirat ćemo sve karaktere, bez obzira radi li se o slovima, brojevima ili
specijalnim karakterima.
 Pri tome ćemo ručno određivati duljinu ključa K, dok ćemo sam ključ
određivati pomoću generatora slučajnih brojeva.
 Napravimo najprije funkciju koja će generirati ključ za zadani D

Prof. dr. sc. Alen Lovrenčić Page 6


Primjer 1 – Vigenéreova šifra

 Kljuc(K[], D)
1. Za i=0..D-1 radi
2. K[i] = rand(0..127)

Prof. dr. sc. Alen Lovrenčić Page 7


Primjer 1 – Vigenéreova šifra

#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

void Kljuc (char K[], int D) {


srand(time(0));
for (int i = 0; i <D; i++)
K[i] = (char)(rand()%128);
}

Prof. dr. sc. Alen Lovrenčić Page 8


Primjer 1 – Vigenéreova šifra

 U glavnom programu ćemo imati dvije opcije: Enkriptiranje i dekriptiranje


 Kod enkripcije treba unijeti ime datoteke s tekstom, ime datoteke koja će
sadržavati kriptotekst i duljinu ključa
 Kod dekripcije osim datoteke s kriptotekstom, datoteke koja će
sadržavati dekriptirani tekst i duljine ključa trebamo unijeti i sam ključ koji
se koristio kod enkripcije.
 Napravit ćemo sada ove dvije funkcije

Prof. dr. sc. Alen Lovrenčić Page 9


Primjer 1 – Vigenéreova šifra

 Encript()
1. Učitaj ime datoteke s tekstom
2. Učitaj ime datoteke koja će sadržavati kriptotekst
3. Učitaj duljinu ključa
4. Pozovi funkciju za određivnje ključa
5. Pozovi funkciju za enkripciju
6. Otvori kriptotekst u Notepadu
7. Ispiši korišteni ključ

Prof. dr. sc. Alen Lovrenčić Page 10


Primjer 1 – Vigenéreova šifra

void Encrypt(char [], char [], char, char []);

void Enkriptiraj(){
char dat[200], kript[200], pom[200] = "notepad ";
short D;
cout << "Upisite naziv datoteke: ";
cin.ignore();
cin.getline(dat,200);
cout << "Upisite naziv kriptoteksta: ";
cin.getline(kript,200);
cout << "D = ";
cin >> D;
char *K = new char [D];
Kljuc(K,D);
Encrypt(dat, kript, D, K);
strcat(pom,kript);
system(pom);
for (int i=0; i <D-1; i++)
cout << (int)K[i] << " ";
cout << (int)K[D-1] << endl;
system("pause");
delete []K;
}

Prof. dr. sc. Alen Lovrenčić Page 11


Primjer 1 – Vigenéreova šifra

 Kod dekripcije ne trebamo ispisivati ključ, kao kod nekripcije


 No, tu dolazi do malih problema s unosom ključa.
 Sjetimo se da je ključ polje tipa char!
 Ako upisujemo u varijable tipa char izravno, naše brojke će biti
shvaćene kao alfanumerički podaci, a ne kao brojevi kako bismo mi to
željeli.
 Stoga moramo prvo učitavati svaki pojedini broj ključa u podatak tipa
int, a tek ga nakon toga pretvoriti u char.

Prof. dr. sc. Alen Lovrenčić Page 12


Primjer 1 – Vigenéreova šifra

 Dekriptiraj
1. Učitaj ime datoteke s kriptotekstom
2. Učitaj ime datoteke koja će sadržavati tekst
3. Učitaj duljinu ključa
4. Učitaj ključ
5. Pozovi funkciju za dekripciju
6. Otvori tekst u notepadu

Prof. dr. sc. Alen Lovrenčić Page 13


Primjer 1 – Vigenéreova šifra

void Decrypt(char [], char [], char, char [](;

void Dekriptiraj() {
char dat[200], kript[200], pom[200] = "notepad ";
short D;
cout << "Upisite naziv kriptoteksta: ";
cin.ignore();
cin.getline(kript,200);
cout << "Upisite naziv datoteke: ";
cin.getline(dat,200);
cout << "D = ";
cin >> D;
cout << "Unesite kljuc: ";
int j;
for (int i = 0 ; i < D ; i++) {
cin >> j;
K[i] = (unsigned char)j;
}
Decrypt(dat, kript, D, K);
strcat(pom,dat);
system(pom);
system("pause");
delete []K;
}

Prof. dr. sc. Alen Lovrenčić Page 14


Primjer 1 – Vigenéreova šifra

 Preostalo nam je napraviti funkcije za samu enkripciju i dekripciju. One


su vrlo slične
 Počnimo s enkripcijom
 Čitat će se slovo po slovo (Koja je to ono funkcija???)
 0-tom slovu će se dodati K[0] modulo 128 iz ključa
 1. slovu K[1] modulo 128 itd.

 To ćemo napraviti da ćemo imati brojač L koji će krenuti od 0 i za svako


će se pročitano slovo povećati za 1 modulo D

Prof. dr. sc. Alen Lovrenčić Page 15


Primjer 1 – Vigenéreova šifra

 Enriptiranje(datoteka, kriptotekst, D, K)
1. Otvori datoteku za čitanje
2. Otvori kriptotekst za pisanje
3. L=0
4. Sve dok nismo došli do kraja datoteke radi
5. Čitaj jedan znak u C
6. Piši znak (C+K[L])%128
7. L = (L + 1)%D
8. Zatvori datoteku
9. Zatvori kriptotekst

Prof. dr. sc. Alen Lovrenčić Page 16


Primjer 1 – Vigenéreova šifra

void Encrypt (char datoteka[], char kriptotekst[], char D,


char K[]) {
ifstream ulaz(datoteka);
ofstream izlaz(kriptotekst);
int L = 0;
while (!ulaz.eof()) {
unsigned char c = ulaz.get();
if (!ulaz.eof()) {
izlaz << (char)(((int)c+K[L])%128);
L=(L+1)%D;
Ovo je još jedan
}
način kako se
} može provjeravati
ulaz.close(); jesmo li stigli do
izlaz.close(); kraja datoteke.
}

Prof. dr. sc. Alen Lovrenčić Page 17


Primjer 1 – Vigenéreova šifra

 Funkcija za dekripciju vrlo je slična funkciji za dekripciju, osim što


umjesto da zbraja oduzima vrijednosti iz ključa.
 Ima još jedna razlika
 Ne bismo željeli dobivati negativne brojeve kod oduzimanja, jer nam
onda funkcija % neće vraćati ono što želimo
 Stoga ćemo svakom znaku koji pročitmo, nakon što ga pretvorimo u
int, dodati 128.
 Kako se radi o operacijama modulo 128, time nećemo izmijeniti rezultat.

Prof. dr. sc. Alen Lovrenčić Page 18


Primjer 1 – Vigenéreova šifra

 Dekriptianje(datoteka, kriptotekst, D, K)
1. Otvori datoteku za čitanje
2. Otvori kriptotekst za pisanje
3. L=0
4. Sve dok nismo došli do kraja datoteke radi
5. Čitaj jedan znak u C
6. Piši znak (C+128-K[L])%128
7. L = (L + 1)%D
8. Zatvori datoteku
9. Zatvori kriptotekst

Prof. dr. sc. Alen Lovrenčić Page 19


Primjer 1 – Vigenéreova šifra

void Decrypt (char datoteka[], char kriptotekst[], char D,


char K[]) {
ifstream ulaz(kriptotekst);
ofstream izlaz(datoteka);
int L = 0;
while (!ulaz.eof()) {
unsigned char c = ulaz.get();
if (!ulaz.eof()) {
izlaz << (char)(((int)c+128-K[L])%128);
L=(L+1)%D;
}
}
ulaz.close();
izlaz.close();
}

Prof. dr. sc. Alen Lovrenčić Page 20


Primjer 1 – Vigenéreova šifra

 Preostaje nam još napraviti glavni program.


 U njemu ćemo imati izornik te mogućnost izbora opcije.
 Nakon završetka opcije obrisat ćemo zaslon i ponovo ispisati izvornik
 To će se ponavljati dok korisnik ne pritisne opciju za kraj rada.

Prof. dr. sc. Alen Lovrenčić Page 21


Primjer 1 – Vigenéreova šifra

1. Radi
2. Obriši zaslon
3. Ispiši izbornik
4. Učitaj izbor
5. Ako je izbor = 1 Enkodiraj
6. Ako je izbor = 2 Dekodiraj
7. Ako je izbor = 0 završi rad

Prof. dr. sc. Alen Lovrenčić Page 22


Primjer 1 – Vigenéreova šifra

int main () {
short izbor;
do {
system("cls");
cout << "1. Enkriptiranje teksta" << endl;
cout << "2. Dekriptiranje teksta" << endl,
cout << "0. Izlaz" << endl << endl;
cout << "Izbor: ";
cin >> izbor;
switch (izbor) {
case 1: Enkriptiraj();
break;
case 2: Dekriptiraj();
}
} while (izbor != 0);
return 0;
}

Prof. dr. sc. Alen Lovrenčić Page 23

You might also like