Szyfr Vigenere'a

Szyfr Vigenere'a
Ineron 123
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:8
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:

Kopiuj
#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:

Kopiuj
#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;
}
edytowany 1x, ostatnio: kq
kq
Jesteś na forum 8 miesięcy, a post nieotagowany i bez formatowania składni :​(
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9979181)
enedil
A może byś to sformatował? Wcięcia masz błędne.
Ineron 123
Bardzo przepraszam za słabo czytelny post. Spieszyłem się i nie zauważyłem
enedil
Ale nie przepraszaj, tylko popraw
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:7 minut
  • Postów:4931
0

Przejechałeś to debugerem?


vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

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

155 tez jakos dziwnie wyglada - nawet po ww poprawce.

TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:530
1

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

Kopiuj
#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;
}
edytowany 1x, ostatnio: TomaszLiMoon
Ineron 123
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:8
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;
        }
edytowany 1x, ostatnio: Ineron 123

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.