Zadanie 1. Szyfr

Rozważamy szyfrowanie przestawieniowe, w którym kluczemkluczkluczem jest n-elementowa tablica zawierająca różne liczby całkowite z przedziału [1, n]. Kluczem 5-elementowym może być np. tablica [3,2,5,4,1].

Szyfrowanie napisu A (o długości co najmniej n) kluczem n-elementowym P[1..n] odbywa się w następujący sposób:

  • pierwsza litera słowa A zamieniana jest miejscem z literą na pozycji P[1],

  • następnie druga litera słowa A zamieniana jest z literą na pozycji P[2],

  • i tak dalej.

Uzyskane na końcu słowo jest szyfrem napisu A z kluczem P.

Jeśli napis A ma więcej niż n liter, to po n-tym kroku algorytmu kolejną literę znów zamieniamy z literą na pozycji P[1] i tak dalej. Oznacza to, że w i-tym kroku zamieniamy litery na pozycjach i oraz P[1 + (i - 1) mod n].

Przykład:

Tabela ilustruje szyfrowanie słowa INFORMATYKA kluczem P równym [3,2,5,4,1]:

Rv8BDG0u6wqdO
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Napis KAAYTRNFOIM jest zatem szyfrem tekstu INFORMATYKA przy użyciu klucza [3,2,5,4,1].

Zadanie 1.1

W pliku szyfr1.txt dane są:

  • w wierszach nr 1–6  – napisy złożone z 50 liter alfabetu łacińskiego,

  • w wierszu nr 7 – klucz 50-elementowy; liczby oddzielone są pojedynczym znakiem odstępu.

Napisz program, który zaszyfruje wszystkie napisy zawarte w udostępnionym pliku zgodnie z metodą opisaną na początku sekcji. Wynik, czyli zaszyfrowane teksty, zapisz w osobnych wierszach w pliku wyniki_szyfr1.txt.

R16XGblMYTtAc

Przycisk do pobrania pliku TXT z treścią zadania.

Plik TXT o rozmiarze 452.00 B w języku polskim

Do oceny oddajesz:

  • plik wyniki_szyfr1.txt z odpowiedzią (zaszyfrowane napisy zapisane każdy w osobnym wierszu),

  • plik(i) z komputerową realizacją zadania (kodem programu).

Rozwiąż zadanie dla załączonych danych. W tym celu zastosuj jeden z języków programowania: C++, Java lub Python. Odpowiedź do zadania znajdziesz w osobnym pliku, umieszczonym po omówieniu przykładowego rozwiązania.

Zadanie zostało opracowane na podstawie zadania nr 76, które pojawiło się w zbiorze zadań z informatyki autorstwa Centralnej Komisji Egzaminacyjnej.

Ważne!

Do rozwiązania zadania przydatne jest zapamiętanie klucza (z wiersza nr 7) w tablicy 5-elementowej. Niech P[0], P[1], ..., P[49] oznaczają kolejne liczby klucza. W zadaniu należy zaszyfrować 6 danych napisów za pomocą klucza P – w tym celu trzeba napisać funkcję, a następnie uruchomić ją dla kolejnych napisów.

Niech A[0..49] będzie napisem, który chcemy zaszyfrować kluczem P[0..49]. Podkreślmy, że w tablicy P znajdują się wartości od 1 do 50, co oznacza, że trzeba zachować ostrożność przy implementacji procedury szyfrującej – za każdym razem należy zamieniać literę A[i] z literą A[P[i]-1]. Procedurę tę warto zaprogramować w pętli, która wykona operacje przestawiania liter w takiej samej kolejności, jak to zostało podane w treści zadania, czyli od pierwszej do ostatniej litery słowa A. Klucz jest tej samej długości co słowo A, dlatego wystarczy kolejno zamieniać literę A[i] z literą A[P[i]-1] dla kolejnych indeksów i = 0, 1, ..., 49. Na końcu otrzymamy zaszyfrowane słowo wyjściowe.

Uwaga: powyższy komentarz do zadania pochodzi ze zbioru przygotowanego przez CKE.

Przykładowe rozwiązanie

Najpierw wczytujemy dane z pliku. W tym celu będziemy potrzebować dwóch tablic: jednej dla napisów do zaszyfrowania, drugiej dla klucza.

Linia 1. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy 0 kropka kropka 5 zamknij nawias kwadratowy minus wczytaj napisy do zaszyfrowania z pliku minus potrzebny dostęp selektywny do liter. Linia 2. klucz otwórz nawias kwadratowy 0 kropka kropka 49 zamknij nawias kwadratowy minus wczytaj klucz z pliku minus jak w przypadku napisów potrzebny selektywny dostęp do elementów.

Mamy zaszyfrować 6 napisów zapisanych w tablicy. W tym celu utwórzmy pętlę umożliwiającą wykonanie szyfrowania dla kolejnych napisów zapisanych w tablicy napisy_do_zaszyfrowania[].

Linia 1. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy 0 kropka kropka 5 zamknij nawias kwadratowy minus wczytaj napisy do zaszyfrowania z pliku minus potrzebny dostęp selektywny do liter. Linia 2. klucz otwórz nawias kwadratowy 0 kropka kropka 49 zamknij nawias kwadratowy minus wczytaj klucz z pliku minus jak w przypadku napisów potrzebny selektywny dostęp do elementów. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka 5 wykonuj.

Następnym krokiem jest zaszyfrowanie napisów odczytanych wcześniej z pliku. W tym celu potrzebna jest pętla, która przeiteruje po wszystkich literach, z których składa się napis, i zaszyfruje je zgodnie ze sposobem opisanym na początku sekcji. W tym celu wyciągamy literę pod indeksem równym numerowi kroku pętli (kroku szyfrowania - 1, przez indeksowanie od 0) do zmiennej pomocniczej. Następnie na miejsce tej litery zapisujemy literę z miejsca wyznaczonego przez liczbę zapisaną w odpowiadającym literze miejscu w kluczu (liczba z klucza pomniejszona o 1 ze względu na indeksowanie tablic od 0). Następnie w miejscu litery z indeksu wyznaczonego kluczem zapisujemy literę przechowywaną w zmiennej pomocniczej.

Linia 1. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy 0 kropka kropka 5 zamknij nawias kwadratowy minus wczytaj napisy do zaszyfrowania z pliku minus potrzebny dostęp selektywny do liter. Linia 2. klucz otwórz nawias kwadratowy 0 kropka kropka 49 zamknij nawias kwadratowy minus wczytaj klucz z pliku minus jak w przypadku napisów potrzebny selektywny dostęp do elementów. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka 5 wykonuj. Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 49 wykonuj. Linia 6. pomocnicza ← napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 7. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ← napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy klucz otwórz nawias kwadratowy 1 plus otwórz nawias okrągły j minus 1 zamknij nawias okrągły mod 50 zamknij nawias kwadratowy minus 1 zamknij nawias kwadratowy. Linia 8. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy klucz otwórz nawias kwadratowy 1 plus otwórz nawias okrągły j minus 1 zamknij nawias okrągły mod 50 zamknij nawias kwadratowy minus 1 zamknij nawias kwadratowy.

Po zakończeniu obiegów obu pętli otrzymujemy tablicę zaszyfrowanych napisów. Pozostaje zapisać je do pliku wynikowego.

Linia 1. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy 0 kropka kropka 5 zamknij nawias kwadratowy minus wczytaj napisy do zaszyfrowania z pliku minus potrzebny dostęp selektywny do liter. Linia 2. klucz otwórz nawias kwadratowy 0 kropka kropka 49 zamknij nawias kwadratowy minus wczytaj klucz z pliku minus jak w przypadku napisów potrzebny selektywny dostęp do elementów. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka 5 wykonuj. Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 49 wykonuj. Linia 6. pomocnicza ← napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 7. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy ← napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy klucz otwórz nawias kwadratowy 1 plus otwórz nawias okrągły j minus 1 zamknij nawias okrągły mod 50 zamknij nawias kwadratowy minus 1 zamknij nawias kwadratowy. Linia 8. napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy klucz otwórz nawias kwadratowy 1 plus otwórz nawias okrągły j minus 1 zamknij nawias okrągły mod 50 zamknij nawias kwadratowy minus 1 zamknij nawias kwadratowy. Linia 10. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka 5 wykonuj. Linia 11. zapisz napisy podkreślnik do podkreślnik zaszyfrowania otwórz nawias kwadratowy i zamknij nawias kwadratowy do pliku cudzysłów wyniki podkreślnik szyfr1 kropka txt cudzysłów.

Odpowiedź do zadania

Odpowiedź dla danych zapisanych w pliku szyfr1.txt znajduje się w załączniku.

R1aQVjT6eTE5g

Przycisk do pobrania pliku TXT z wynikiem zadania.

Plik TXT o rozmiarze 312.00 B w języku polskim

Słownik

klucz
klucz

w kryptografii: informacja niezbędna do przeprowadzenia procesu szyfrowania lub deszyfrowania

klucz prywatny
klucz prywatny

rodzaj klucza w szyfrach asymetrycznych służący do deszyfrowania szyfrogramów; dostęp do niego powinien mieć tylko odbiorca zaszyfrowanych wiadomości

klucz publiczny
klucz publiczny

rodzaj klucza w szyfrach asymetrycznych służący do szyfrowania tekstu jawnego; nie musi być chroniony ani utrzymywany w tajemnicy, może nawet zostać udostępniony publicznie

szyfr asymetryczny
szyfr asymetryczny

rodzaj szyfru, w którym operuje się dwoma osobnymi kluczami – szyfrującym (publicznym) oraz deszyfrującym (prywatnym)

szyfr symetryczny
szyfr symetryczny

rodzaj szyfru charakteryzujący się zastosowaniem jednego klucza zarówno do szyfrowania, jak i deszyfrowania