Witam forumowicze, mam problem nad którym myślę już kilka godzin i nie potrafię znaleźć odpowiedzi. Napisałem program który szyfruje metodą kolumnową bez większych kłopotów. Problem pojawił się kiedy miałem odszyfrować dany kryptogram. Nie potrafię dojść do rozwiązania w jaki sposób można odszyfrować wyraz/zdanie w których POMINIĘTO SPACJE LUB SĄ PUSTE ZNAKI.
Przepisałem zatem program szyfrujący w taki sposób aby wypełniał puste miejsca X'ami. A potem już całkowicie kombinowałem i ostatecznie mój program czyta wynik w dziwny sposób. Co prawda wszystko działa ale coś mi tutaj nie gra i chyba coś przeoczyłem.
Nie mam również pomysłu na to w jaki sposób użyć klucza przy odczytywaniu wyniku, zakładam że mój sposób, mimo że działa, nie jest optymalny.
PROGRAM SZYFRUJACY:
#include <iostream>
#include <string>
using namespace std;
string szyfrowanieSymetryczne (string wyraz, int n, int klucz[])
{
int wiersze, k{0}; // k -> numer pozycji na stringu
if (wyraz.size()%n==0) wiersze=wyraz.size()/n;
else if (wyraz.size()%n!=0) wiersze=wyraz.size()/n+1;
char tab[wiersze][n];
///////// INICJALIZACJA TABLICY (WYPELNIENIE X'AMI) //////
for (int i=0; i<wiersze; i++)
{
for (int j=0; j<n; j++)
{
tab[i][j]='X';
}
}
//////// WLASCIWE WYPELNIENIE TABLICY ////////
for (int i=0; i<wiersze; i++)
{
for (int j=0; j<n&&k<wyraz.size(); j++, k++)
{
tab[i][j] = wyraz[k];
}
}
/////// WYSWIETLENIE TABLICY //////
for (int i=0; i<wiersze; i++)
{
for (int j=0; j<n; j++)
{
cout<<tab[i][j]<<'\t';
}
cout<<endl;
}
/////// SZYFROWANIE TABLICY ////////
string wynik{""};
for (int i=0; i<n; i++)
{
int k = klucz[i];
for (int j=0; j<wiersze; j++)
{
wynik+=tab[j][k];
}
}
return wynik;
}
int main ()
{
string wyraz;
int n = 3; // n -> liczba kolumn
int klucz[n]{2,1,0}; // klucz -> 2|1|0
cout<<"Podaj wyraz ktory chcesz zakodowac: "; cin>>wyraz;
for (auto & c: wyraz) c = toupper(c); //konwersja na wielkie litery
cout<<szyfrowanieSymetryczne(wyraz, n, klucz);
}
PROGRAM ROZSZYFROWUJĄCY:
#include <iostream>
#include <string>
using namespace std;
string odszyfrowanieSymetryczne (string wyraz, int n, int klucz[])
{
int wiersze{3}, k{0}; // k -> numer pozycji na stringu
if (wyraz.size()%n==0) wiersze=wyraz.size()/n;
else if (wyraz.size()%n!=0) wiersze=wyraz.size()/n+1;
char tab[wiersze][n];
//////// WYPELNIENIE TABLICY ////////
for (int j=0; j<n; j++)
{
for (int i=0; i<wiersze&&k<wyraz.size(); i++, k++)
{
tab[i][j] = wyraz[k];
}
}
/////// WYSWIETLENIE TABLICY /////////
for (int i=0; i<wiersze; i++)
{
for (int j=0; j<n; j++)
{
cout<<tab[i][j]<<'\t';
}
cout<<endl;
}
/////// ODSZYFROWANIE TABLICY ////////
string wynik{""};
for (int i=0; i<wiersze; i++)
{
if (tab[i][klucz[0]]!='X') wynik+=tab[i][2];
if (tab[i][klucz[1]]!='X') wynik+=tab[i][1];
if (tab[i][klucz[2]]!='X') wynik+=tab[i][0];
}
return wynik;
}
int main ()
{
string wyraz;
int n = 3; // n -> liczba kolumn
int klucz[n]{2,1,0}; // klucz -> 2|1|0
cout<<"Podaj wyraz ktory chcesz odszyfrowac: "; cin>>wyraz;
for (auto & c: wyraz) c = toupper(c); //konwersja na wielkie litery
cout<<odszyfrowanieSymetryczne(wyraz, n, klucz);
}
Moje pytania to:
- Czy moje programy są prawidłową implementacją kolumnowej metody szyfrującej? Działają ale przebieg odczytywania zaszyfrowanej wiadomości jest trochę na opak.
- W jaki sposób mogę przepisać ten program aby odszyfrowywać zdania z pominiętymi spacjami zamiast jakiegoś znaku (w moim przypadku 'X') (tzn. na przykład dla wyrazu SAMOLOT, zaszyfrowanym wynikiem byłoby MOALSOT a nie MO(X)AL(X)SOT, jak to odszyfrować?)
- Jak mam użyć klucza przy odszyfrowywaniu wyrazu?
Poniżej załączam jezcze przebieg dodawania do stringa wynik w moich programach.