Professional Documents
Culture Documents
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.
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.
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
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.
Š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
Kljuc(K[], D)
1. Za i=0..D-1 radi
2. K[i] = rand(0..127)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
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č
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;
}
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
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;
}
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
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
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
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;
}