Szyfrowanie/Deszyfrowanie - szyfr kolumnowy/płotkowy

0

Witam mam problem z szyfrem kolumnowym. Polega on na narysowaniu tabeli o ilości kolumn co ilość cyfr w kluczu np. dla klucza {2,1,4,0,3} liczba kolumn wynosi 5. Następnie dzielimy nasze słowo przez liczbę kolumn i jeżeli reszta z dzielenia jest różna od 0 to znaczy, że zabraknie miejsca i dzielimy przez liczbę kolumn+1. Następnie poziomo zapisujemy słowo w tabeli i szczytujemy po kolumnach tak jak na zdjęciu.

[]screenshot-20211201134149.png

Program na szyfrowanie wygląda następująco

screenshot-20211201134402.png

Działa on i poprawnie szyfruje nasz Napis kryptoanaliza.

Problem jednak jest z deszyfrowaniem. Napisałem taki program ale nie poprawnie szyfruje.

screenshot-20211201134611.png

Tak wygląda main() jeszcze

screenshot-20211201134649.png

To co zwraca program po wpisaniu odpowiednich danych

screenshot-20211201134734.png

Za każdą pomoc z góry bardzo dziękuje

2

Nie wrzucaj kodu jako obrazek. Jak ja to mam sobie uruchomić z obrazka?

0
#include <iostream>
#include <cstring>

using namespace std;
const int MAX=100;

string szyfruj(string tekst, int klucz[], int n)
{
 string wynik;
 char tablica[MAX][MAX];
 int dl=tekst.size(), m;
 if (dl%n) m=dl/n+1;
 else m=dl/n;
 int k=0;
 for (int i=0;i<m;i++)
  for (int j=0;j<n;j++)
   if (k<dl)
   {
    tablica[i][j]=tekst[k];
    k++;
   }
   else tablica[i][j]='\0';
 int l;
 for (int k=0;k<n;k++)
 {
  l=klucz[k];
  for (int i=0;i<m;i++)
   if (tablica[i][l]!='\0') wynik+=tablica[i][l];
 }
 return wynik;
}
// j- kolumna k- indeks kolumny  s-szyfrogram, dl - dlugosc napisu, n-liczba kolumn m-liczba wierszy;

string deszyfruj(string tekst, int klucz[], int n)
{
    string tekstwy="";
    int m,k,s=0;
    int dl=tekst.size();
    if(dl%n!=0)
    {
        m=dl/n+1;
    }
    else
    {
        m=dl/n;
    }
    cout<<"m="<<m<<endl;
    char t[m][n];
    for(int j=0; j<n; j++)
    {
        k=klucz[j];
        for(int i=0; i<m; i++)
        {
            if(s<dl)
            {
                t[i][k]=tekst[s];
            }
            else
            {
                t[i][k]='\0';
            }
            s++;
        }
    }
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<n; j++)
        {
            tekstwy+=t[i][j];
        }
    }
return tekstwy;
}


main()
{
 string tekst;
 int n, klucz[MAX];

 string szyfrogram="YNARAZTLKOIPA";
 cout<<"podaj liczbe kolumn: ";
 cin>>n;
 cout<<"kluczem jest permutacja numerow kolumn z zakresu: 0 - "<<n-1<<endl;
 for (int j=0;j<n;j++)
 {
  cout<<"podaj element klucza nr "<<j+1<<": ";
  cin>>klucz[j];
 }
 cout<<deszyfruj(szyfrogram,klucz,n);
 return 0;
}
4

W algorytmie deszyfrującym nie sprawdzasz czy dana kolumna jest zapełniona całkowicie ( "YNA" , "RAZ" ) czy też jej ostatni element jest pusty ( "PA" , **"TL" **). Dlatego też tablica t[m][n](*) nie jest poprawnie wypełniona ( powinna wyglądać tak jak na rysunku ), co powoduje błędne wyniki.

(*) Nie jest to poprawna definicja tablicy w standardzie C++ i chociaż g++ wspiera **VLA **to lepiej użyć do tego celu std::vector.

1

Twój kod pada dla dużo prostszych danych wejściowych: https://godbolt.org/z/bb4sG8Tqc
Zwróć uwagę, że pada na testach, gdzie szyfrogram nie wypełnia wszystkich kolumn.

example.cpp:80: FAILED:
  REQUIRE( message == deszyfruj(encrypted, key) )
with expansion:
  "A" == "A"

example.cpp:80: FAILED:
  REQUIRE( message == deszyfruj(encrypted, key) )
with expansion:
  "AB" == "AB"

to oznacza, że wynik zawiera znaki, które nie są widoczne.

2

Strasznie przekombinowałeś ten swój kod: https://godbolt.org/z/sMbqfvodz
https://godbolt.org/z/5Ys87r8hv

1 użytkowników online, w tym zalogowanych: 0, gości: 1