Szyfr Vigenere'a

0

Witam! Otóż mam problem z szyfrem Vigenere'a, pierwszy program deszyfruje jak należy, ale kiedy przychodzi do szyfrowania to już nie jest tak kolorowo, wyświetla poprawnie tylko pojedyncze litery, zauważyłem problem jednak nie potrafię znaleźć jego źródła. Proszę o pomoc!

DESZYFRUJE:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int s,k, l=0;
    string slowo, klucz;
    getline(cin, slowo);
    getline(cin,klucz);
    s=slowo.length();
    k=klucz.length();
    for(int i=0; i<s; i++)
    {
        if(slowo[i]==32)
        {
            slowo[i]=' ';
        }
        else
        {
            if(l>=k)
            {
            l=0;
            }
            slowo[i]=slowo[i]-klucz[l];
            l++;

            if(slowo[i]<=0)
            {
                slowo[i]=slowo[i]+64+26;
            }
            else
            {
                slowo[i]=slowo[i]+64;
            }

        }
    }
    cout<<slowo;
}

SZYFRUJE:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int s,k, l=0;
    string slowo, klucz;
    getline(cin, slowo);
    cin>>klucz;
    s=slowo.length();
    k=klucz.length();
    for(int i=0; i<s; i++)
    {
        if(slowo[i]==32)
        {
            slowo[i]=' ';
        }
        else
        {
            if(l>=k)
            {
            l=0;
            }
            slowo[i]=slowo[i]+klucz[l];
            l++;

            if(slowo[i]>=155)
            {
                slowo[i]=slowo[i]-64-26;
            }
        else
        {
           slowo[i]=slowo[i]-64;
        }
        }
    }
    cout<<slowo;
}
0

Przejechałeś to debugerem?

1

Zamien magiczne liczby na literaly znakowe.
Przykladowo jest: 32
Powinno byc: ' '

155 tez jakos dziwnie wyglada - nawet po ww poprawce.

1

Implementację algorytmu szyfru Vigenère’a można umieścić w jednej szablonowej funkcji:

#include <iostream>

using namespace std;

enum class MODE { ENCRYPT , DECRYPT };

template< MODE mode >
string process( const string& text , const string& key )
{
    string result;

    for( size_t i = 0 ; i < text.size() ; ++i )
    {
        result.push_back(text[i]==' '?' ':'A'+(text[i]+(mode==MODE::DECRYPT?26-key[i%key.size()]:key[i%key.size()]))%26);
    }

    return result;
}

int main()
{
    string text  { "THIS IS PLAIN TEXT" };
    string key  { "PASSWORD" };

    auto secret = process<MODE::ENCRYPT>( text , key );
    cout << secret << " -> " << process<MODE::DECRYPT>( secret , key ) << "\n";

    return 0;
}
0

Nie znalazłem błędu, ale do sprawy podszedłem innym sposobem i się udało. Dzięki za pomoc!

        slowo[i]=slowo[i]+klucz[l];
        l++;
        slowo[i]=slowo[i]-64-26;

        if(slowo[i]<65)
        {
            slowo[i]=slowo[i]+26;
        }

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