szyfr one-time pad

0

Witam, mam problem z szyfrowaniem, a mianowicie mój program działa poprawnie tylko, w niektórych przypadkach.
Daje do wklejenia program, gdyby ktoś chciał.

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

inline int sprawdz(char znak)
{
	//jesli jest mala litera
	if(znak >= 'a' && znak <= 'z') return 0;
	//jesli jest duza litera
	if(znak >= 'A' && znak <= 'Z') return 1;
	//inna niż litera
	return 2;
}

void szyfruj( string &tab)
{
	int pom;
	char a, z;
	int x;
    string kod;
    fstream klucz;

    klucz.open("klucz.txt", ios::out | ios::app);

    for(int i = 0; i < tab.size(); i++)
        {
            x = rand() % 26;
            kod += 'A' + x;
        }


	for(int i = 0; i < tab.size(); i++)
	{
        //ustalienie wielkosci litery - funkcja sprawdz
		pom = sprawdz(tab[i]);

		if(pom < 2)
		{
			if(pom == 0)
				a = 'a', z = 'z';
			else
				a = 'A', z = 'Z';

			if( (tab[i]-a) + (kod[i]-'A') <= 26) //26
            {
                tab[i] += (kod[i]-'A');
                klucz << kod[i];

            }else{
                tab[i] += (kod[i]-'A') - 26;
                klucz << kod[i];
            }
		}
	} klucz.close();
}

void deszyfruj( string &tab)
{
	int pom;
	char a, z;
	int x;
    string kod;
    kod.clear();
    fstream klucz;

    klucz.open("klucz.txt", ios::in);
    getline(klucz,kod);

	for(int i = 0; i < tab.size(); i++)
	{
        //ustalienie wielkosci litery - funkcja sprawdz
		pom = sprawdz(tab[i]);

        x = (int)(kod[i]-'A');

		if(pom < 2)
		{
			if(pom == 0)
				a = 'a', z = 'z';
			else
				a = 'A', z = 'Z';

			if( (tab[i]-a) - x < 0) //26
            {
                tab[i] += (26 - x);

            }else{
                tab[i] -= x;
            }
		}
	} klucz.close();
}

int main(int argc, char* argv[])
{
    string odczyt, zapis;
    fstream plik,szyfr;

    int odpowiedz;

    srand(time(NULL));

    if(argc ==3)
    {
        odczyt = argv[1];
        zapis = argv[2];
    }
    else
    {
        cout <<"Podaj nazwe pliku do odczytu : ";
        cin >> odczyt;
        cout <<"Podaj nazwe pliku do zapisu : ";
        cin >> zapis;
    }

plik.open(odczyt, ios::in );

    if(plik.good())
    {
        string wiersz;

        cout << "Zaszyfruj [1]  Odszyfruj [2] : ";
        cin >> odpowiedz;

        szyfr.open(zapis, ios::out);

        switch(odpowiedz)
        {
            case 1:
            while(getline(plik,wiersz))
            {
                szyfruj(wiersz);
                szyfr << wiersz + "\n";
            }
            break;

            case 2:
            while(getline(plik,wiersz))
            {

                deszyfruj(wiersz);
                szyfr << wiersz + "\n";
            }
            remove("klucz.txt");
            break;
        }
        szyfr.close();

    }else cout << "Bledna nazwa pliku";
    plik.close();

    return 0;
}

A nie działa mi mianowicie funkcja deszyfruj, bo klucz jak i szyfrogram są poprawnie generowane.

void deszyfruj( string &tab)
{
	int pom;
	char a, z;
	int x;
    string kod;
    kod.clear();
    fstream klucz;

    klucz.open("klucz.txt", ios::in);
    getline(klucz,kod);

	for(int i = 0; i < tab.size(); i++)
	{
        //ustalienie wielkosci litery - funkcja sprawdz
		pom = sprawdz(tab[i]);

        x = (int)(kod[i]-'A');

		if(pom < 2)
		{
			if(pom == 0)
				a = 'a', z = 'z';
			else
				a = 'A', z = 'Z';

			if( (tab[i]-a) - x < 0) //26
            {
                tab[i] += (26 - x);

            }else{
                tab[i] -= x;
            }
		}
	} klucz.close();
}
2

Co znaczy: "nie działa"?
Pokaż wejście i spodziewane wyjście w porównaniu do tego, jakie otrzymujesz.

0

Jeśli szyfruje słowo bez żadnych spacji czy znaków specjalnych, program poprawnie rozszyfrowywuje, jednak gdy takowe się pojawią to wszystko miesza
Wejscie : Witam Witam Witam :)
Wyjście : Witam Gbjte Yslap :)

2

Wywal wszystko i napisz porządnie.
Tym razem użyj standardowych funkcji isupper()/islower().
Czemu zakładasz że klucz będzie mieć nie mniejszy rozmiar niż szyfrowany tekst?
Zastanów się nad czymś takim if(islower(src[i]) src[i]='a'+((src[i]-'a')+(key[k]-'A')+26)%26; zamiast litanii if'ów.

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