czwartek, 16 czerwca 2011

Szyfr przestawieniowy w C++

Ostatnio trochę grzebałem w zadaniach maturalnych z informatyki i trafiłem na polecenie napisania aplikacji używającej szyfru przestawieniowego opartego na macierzy do zaszyfrowania dowolnego tekstu. Długo się nie zastanawiając machnąłem sobie programik, którym mam zamiar się z wami podzielić i przy okazji nieco opisać jego bebechy. Kod programu z implementacją szyfru przestawieniowego:

#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

int main()
{
    string s = "ala ma kota a kot ma ale";
    string result = "";
    int matrix_size = ceil(sqrt(s.size()));
    char matrix[matrix_size][matrix_size];

    for (int i=0; i<matrix_size; i++) {
        for (int j=0; j<matrix_size; j++) {
            if ((i*matrix_size)+j >= s.length()) {
                matrix[i][j] = '_';
                continue;
            }
            matrix[i][j] = (s[(i*matrix_size)+j] == ' ' ? '_' : s[(i*matrix_size)+j]);
        }
    }

    for (int i=0; i<matrix_size; i++) {
        for (int j=0; j<matrix_size; j++)
            result += matrix[j][i];
    }

    cout << "Tekst zaszyfrowany: " << result << endl;

    return 0;
}

Zacznijmy od linii 15. Tam do wcześniej zdefiniowanego stringa wpisywany jest tekst, który chcemy zaszyfrować. Następnie obliczana jest długość tekstu (linia 17), zaś na jej podstawie program wylicza ilość kolumn i wierszów macierzy (linia 18), w której będzie umieszczony tekst. Funkcja sqrt() liczy pierwiastek z podanej liczby, natomiast ceil() zaokrągla w górę liczbę podaną jako argument. W linii 20 definiujemy macierz, do której następnie wpiszemy tekst do zaszyfrowania.
W liniach 23 - 29 mamy pętle, które wierszami, po jednej literce zapełniają każdą komórkę macierzy. Spacje zamieniane są na podkreślnik. Gdy ilość komórek jest większa od ilości znaków w tekście, końcowe komórki macierzy również są wypełniane podkreślnikami. Po wypełnieniu macierzy znakami w liniach 32 - 37 tekst z tablicy jest spisywany kolumnami do stringa result. W linii 40 na urządzenie wyjścia wypisywany jest zaszyfrowany tekst.

Jest to chyba najprostszy możliwy sposób w jaki można zaimplementować algorytm szyfrowania przestawieniowego.