Sprawdź się
Zadanie 2.
Podpunkt 2.
Zaszyfrowane wiadomości z pierwszej części zadania okazały się bardzo łatwe do odszyfrowania. W związku z tym pracownik agencji wywiadowczej dostał zadanie, aby oprócz zaszyfrowania słów za pomocą szyfru Vigenère'a zastosował dodatkowe szyfrowanie.
Pracownik wymyślił, że słowa zostaną najpierw zaszyfrowane za pomocą szyfru Vigenère'a , a następnie za pomocą szyfru Cezara.
W pliku dane.txt
znajdują się słowa do zaszyfrowania, a obok każdego słowa jest napisana liczba, która oznacza wartość przesunięcia (klucz) szyfru Cezara.
Napisz program, który zaszyfruje zadane w pliku ciągi znaków za pomocą szyfru Vigenère'a , kluczem „KLUCZ”, a następnie za pomocą szyfru Cezara, według podanej w pliku wartości klucza. Wyniki należy zapisać do osobnego pliku.
Przykładowy ciąg znaków „GRAF” i klucz równy 4.
GRAF 4
Wynik szyfrowania:
UGYL
Dane zawarte w pliku tekstowym zostały umieszczone w tablicach i znajdują się w poniższych ćwiczeniach. Pamiętaj jednak, że rozwiązując zadania maturalne, musisz dokonać prawidłowego wczytania danych z pliku tekstowego do swojego programu.
Napisz program w języku C++, który zaszyfruje zadane w pliku ciągi znaków za pomocą szyfru Vigenère'a, kluczem „KLUCZ”, a następnie za pomocą szyfru Cezara, według podanej w pliku wartości klucza.
Specyfikacja:
Dane:
alfabet, tabela
– tablica znakówdane
– tablica łańcuchów znakówklucze
– tablica elementów typu int
Wynik:
Program na wyjściu standardowym zwróci zakodowane za pomocą szyfru Cezara łańcuchy znaków.
Przykładowe rozwiązanie zadania:
#include <iostream>
#include <algorithm>
using namespace std;
char alfabet[26];
char tabela[26][26];
string dane[16] = {"GRAF", "DAL", "KORAL", "RAFA", "SKORPION", "GENEZA",
"LOKI", "KRAJ", "SER", "TAKTYKA", "CHMURA", "POGODA", "REJS", "STATEK",
"TRAKTOR", "MARMUR"};
int klucze[16] = {12, 5, 6, 7, 4, 5, 56, 44, 23, 2, 55, 6, 2, 44, 23, 77};
void wypelnij() {
int z = 0;
for(int i = 65; i < 91; i++) {
alfabet[z] = (char)i;
z++;
}
for(int z = 0; z < 26; z++) {
for (int x = 0; x < 26; x++) {
tabela[z][x] = alfabet[x];
}
for (int b = 0; b < 26 - 1; ++b) {
swap(alfabet[b], alfabet[b+1]);
}
}
}
string szyfruj(string wiadomosc, string klucz, int klucz2) {
string zaszyfrowane = "";
if(klucz2 > 26) {
klucz2 = klucz2 % 26;
}
for (int i = 0, j = 0; i < wiadomosc.size(); i++) {
char litera = tabela[(int)(wiadomosc[i]-65)][(int)(klucz[j]-65)];
if(litera + klucz2 > 90) {
litera = (char) (litera + klucz2 - 26);
} else {
litera = (char) (litera + klucz2);
}
zaszyfrowane += litera;
if (j == klucz.size() - 1) {
j = 0;
} else {
j++;
}
}
return zaszyfrowane;
}
int main() {
wypelnij();
for(int i = 0; i < 16; i++) {
cout << szyfruj(dane[i], "KLUCZ", klucze[i]) << endl;
}
return 0;
}
Napisz program w języku Java, który zaszyfruje zadane w pliku ciągi znaków za pomocą szyfru Vigenère'a, kluczem „KLUCZ”, a następnie za pomocą szyfru Cezara, według podanej w pliku wartości klucza.
Specyfikacja:
Dane:
alfabetLacinski, tabela
– tablica znakówdane
– tablica łańcuchów znakówklucze
– tablica elementów typu int
Wynik:
Program na wyjściu standardowym zwróci zakodowane za pomocą szyfru Cezara łańcuchy znaków.
Przykładowe rozwiązanie zadania:
public class szyfr {
static char[] alfabetLacinski = new char[26];
static char[][] tabela = new char[26][26];
static String[] dane = {"GRAF", "DAL", "KORAL", "RAFA", "SKORPION", "GENEZA",
"LOKI", "KRAJ", "SER", "TAKTYKA", "CHMURA", "POGODA", "REJS", "STATEK",
"TRAKTOR", "MARMUR"};
static int[] klucze = {12, 5, 6, 7, 4, 5, 56, 44, 23, 2, 55, 6, 2, 44, 23, 77};
static void wypelnienieTablicy() {
for(int i = 65, z = 0; i < 91; i++, z++) {
alfabetLacinski[z] = (char) i;
}
for(int j = 0; j < 26; j++) {
for(int k = 0; k < 26; k++) {
tabela[j][k] = alfabetLacinski[k];
}
for(int l = 0; l < 26 - 1; l++) {
char temp = alfabetLacinski[l];
alfabetLacinski[l] = alfabetLacinski[l + 1];
alfabetLacinski[l + 1] = temp;
}
}
}
static String zaszyfruj(String doZaszyfrowania, String klucz, int klucz2) {
String wynikSzyfrowania = "";
if (klucz2 > 26) {
klucz2 = klucz2 % 26;
}
for (int i = 0, j = 0; i < doZaszyfrowania.length(); i++) {
char litera = tabela[(int)(doZaszyfrowania.charAt(i)-65)][(int)(klucz.charAt(j)-65)];
if(litera + klucz2 > 90) {
litera = (char) (litera + klucz2 - 26);
} else {
litera = (char) (litera + klucz2);
}
wynikSzyfrowania += litera;
if (j == klucz.length() - 1) {
j = 0;
} else {
j++;
}
}
return wynikSzyfrowania;
}
public static void main(String[] args) {
wypelnienieTablicy();
for(int i = 0; i < dane.length; i++) {
System.out.println(zaszyfruj(dane[i], "KLUCZ", klucze[i]));
}
}
}
Napisz program w języku Python, który zaszyfruje zadane w pliku ciągi znaków za pomocą szyfru Vigenère'a, kluczem „KLUCZ”, a następnie za pomocą szyfru Cezara, według podanej w pliku wartości klucza.
Specyfikacja:
Dane:
alfabet, tabela
– tablica znakówdane
– tablica łańcuchów znakówklucze
– tablica elementów typu int
Wynik:
Program na wyjściu standardowym zwróci zakodowane za pomocą szyfru Cezara łańcuchy znaków.
Przykładowe rozwiązanie zadania:
dane = ["GRAF", "DAL", "KORAL", "RAFA", "SKORPION", "GENEZA", "LOKI", "KRAJ", "SER", "TAKTYKA", "CHMURA", "POGODA", "REJS", "STATEK", "TRAKTOR", "MARMUR"]
klucze = [12, 5, 6, 7, 4, 5, 56, 44, 23, 2, 55, 6, 2, 44, 23, 77]
alfabet = [chr(i) for i in range(65, 91)]
tabela = []
for z in range(26):
wiersz = []
for x in range(26):
wiersz.append(alfabet[x])
tabela.append(wiersz)
for b in range(26 - 1):
temp = alfabet[b]
alfabet[b] = alfabet[b+1]
alfabet[b+1] = temp
def szyfruj(wiadomosc, klucz, klucz2):
zaszyfrowane = ""
if klucz2 > 26:
klucz2 = klucz2 % 26
j = 0
for i in range (len(wiadomosc)):
litera = tabela[int(ord(wiadomosc[i])-65)][int(ord(klucz[j])-65)]
if ord(litera) + klucz2 > 90:
litera = chr(ord(litera) + klucz2 - 26)
else:
litera = chr(ord(litera) + klucz2)
zaszyfrowane += litera
if j == len(klucz) - 1:
j = 0
else:
j += 1
return zaszyfrowane
for i in range(16):
print(szyfruj(dane[i], "KLUCZ", klucze[i]))