Program szyfrujący/deszyfrujący za pomocą algorytmu XOR (C++)

0

Witam.

Mam problem z poniższym programem. Działa on normalnie tzn. szyfruje i deszyfruje pliki ale jedynie zapisane w formacie txt.
Problem polega na tym, że nie wiem jak zmienić program by szyfrował/deszyfrował po bajtach a nie po znakach jak to jest w obecnej wersji. Chciałbym, żeby szyfrował jeszcze np. dokumenty w formacie pdf.

Za jakąkolwiek pomoc z góry bardzo dziękuję.

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    FILE *we, *wy;
    char znak;                  
    char haslo;         
    char zero='0';               
    char jeden='1';
 
    char plik_wejsciowy[255];         
    char plik_haslo[255];         
    char plik_wyjsciowy[255];  
 
    cout<<"Podaj nazwe pliku wejsciowego: " ;
    cin>>plik_wejsciowy;             
    cout<<"Podaj haslo: " ;
    cin>>haslo;             
    cout<<"Podaj nazwe pliku wynikowego: ";
    cin>>plik_wyjsciowy; 
 
if((we=fopen(plik_wejsciowy,"rb"))!=NULL)      
 {
    if((wy=fopen(plik_wyjsciowy,"wb"))!=NULL)  
    {
        while((znak=getc(we))!=EOF)
        {
                       cout<<znak;
 
            znak=znak^haslo; 
            cout<<"   "<<znak<<endl;  
            putc(znak,wy);
        }
        fclose(wy);     
    }
    fclose(we);     
}
    cout<<"Operacja zostala zakonczona";
    system("PAUSE");
    return EXIT_SUCCESS;
}
0

To może zamiast getc daj fread: http://www.cplusplus.com/reference/clibrary/cstdio/fread/
A co do PDF'a poczytaj w necie dużo artykułów jest.

0

Ja nie widzę problemu w tym kodzie, powinno działać dla wszystkich plików (nie licząc wyświetlania na konsoli, które może robić dziwne rzeczy gdy dostarczasz dziwne znaki ASCII).
Użycie fread i fwrite powinno jedynie przyspieszyć działanie (jeśli dobrze się tego użyje).

0

Dzięki za podpowiedź odnośnie usprawnienia.
Niestety ale program po kompilacji i uruchomieniu owszem szyfruje pdf-a ale nie można go otworzyć bo wyskakuje błąd tak samo dzieje się przy próbie odszyfrowania pliku.

Bardzo proszę o pomoc.

0

bo wyskakuje błąd

Faktycznie. Nie odpala mi samochód, bo nie chce zapalić :| Pomożesz?

Jaki błąd???

1

Domyślam się, że szyfrujesz plik od początku do końca, a nie tylko jego zawartość(tą zrozumiałą dla użytkownika) - to powoduje problem w formacie. Myślę, że szyfrowanie pdf-a żeby można było go później otworzyć nie jest takie proste... Ale to tylko przypuszczenia.

2

Mała dygresja apropos wersji z pierwszego postu:

while((znak=getc(we))!=EOF)

Zakończy działanie w dwóch wypadkach:
#Plik się skończy (rzeczywisty EOF),
#Z pliku odczytany zostanie bajt 0xFF.

Dlaczego? Ponieważ wynik getc() trafia do char'a, który 2 różne (z zakresu int: 255: normalny bajt, -1: koniec pliku) wartości zaczyna interpretować jako to samo.
Zamiana 'znak'u na unsigned char z kolei skończy się pętlą nieskończoną, gdyż uchar rzutowany do int (a taki zwykle jest EOF) nigdy nie będzie ujemny.

Reasumując: Pierwsza wersja będzie poprawna, jeśli zmienić typ 'znak'u na int. Wszelkie rzutowania później wyglądają na poprawne.

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