• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfr XOR na pliku

0 głosów
680 wizyt
pytanie zadane 31 grudnia 2022 w C i C++ przez Noizz00 Użytkownik (910 p.)
edycja 31 grudnia 2022 przez Noizz00

Witam, mam za zadanie napisać program szyfrujący plik otworzony w trybie binarnym za pomocą szyfru XOR (Np. ifstream plik("xor.txt", ios::binary)). Dowiedziałem się że najlepszą opcją byłoby szyfrowanie znaków w postaci unsigned char, jednak rodzą się z tego moje wątpliwości. Myślę, że jedyną opcją byłoby odczytanie zawartości pliku do tablicy znaków, jednak nie będę wiedział, jak długie będą napisy w pliku. Dodatkowo próbowałem jako test zaszyfrować napis (który zawierał spacje) kluczem, najpierw szyfrując bezpośrednio na znakach (znak1 ^ znak2) później na kodach ASCII (liczba1 - 'A' ^ liczba2 - 'A')  + 'A' oraz (liczba1 - ' ') ^ (liczba2 - ' ') + ' ' i w wyniku szyfrowania powstawały dziwne znaki. Najwyraźniej nie do końca rozumiem idei tego szyfrowania i dlatego piszę tutaj z pomocą. Jeżeli ktoś mógłby mi wyjaśnić jak będzie można to mniej więcej zaimplementować w C++ będę bardzo wdzięczny. Najlepiej bez użycia skomplikowanych komend.

Nie wiem czy to pomoże, ale zamieszczam na razie kod wspominanego programu testowego.

#include <iostream>

using namespace std;

int main()
{
    unsigned char A[13] = "Ala ma kota.";
    unsigned char B[5] = "abcd";
    int a, b;
    for(int i = 0; i < 12; i++)
    {
        a = A[i] - 'A';
        b = B[i] - 'A';
        a ^= b;
        a += 'A';
        cout << (unsigned char)(a);
    }
    return 0;
}
komentarz 31 grudnia 2022 przez Oscar Nałogowiec (29,420 p.)
Skoro ma być w trybie binarnym to te odejmowania i dodawania 'A' chyba są zbędne.

Przy operacjach logicznych operuje się poszczególnych bitach, czy zmienna jest ze znakiem czy nie nie ma znaczenia.

Zwykle plik otwarty w trybie binarnym czyta się blokami. Najprościej będzie wybrać rozmiar bloku na równy rozmiarowi klucza.
komentarz 1 stycznia 2023 przez Noizz00 Użytkownik (910 p.)
edycja 1 stycznia 2023 przez Noizz00

Zrobiłem coś takiego:

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int main()
{
    string klucz;
    ifstream plik_odczyt;
    plik_odczyt.open("xor.txt", ios::binary);
    if(!plik_odczyt.good())
    {
        cout << "Nie znaleziono pliku do zaszyfrowania. Przy ponownym uruchomieniu programu zadbaj, aby znajdowal sie w odpowiednim miejscu.";
        cout << endl << "Wcisnij ENTER, aby zakonczyc program.";
        getchar();
        return 0;
    }
    cout << "Podaj klucz, ktorym ma zostac zaszyfrowany plik: ";
    cin >> klucz;
    unsigned char * klucz_char = new unsigned char [klucz.length()+1];
    strcpy(klucz_char, klucz.c_str());
    plik_odczyt.seekg(0, plik_odczyt.end);
    int dlugosc = plik_odczyt.tellg();
    plik_odczyt.seekg(0, plik_odczyt.beg);
    unsigned char * bufor = new unsigned char [dlugosc];
    plik_odczyt.read(bufor, dlugosc);
    plik_odczyt.close();
    for(int i = 0; i < dlugosc; i++)
    {
        bufor[i] ^= klucz_char[i%4];
    }
    ofstream plik_zapis;
    plik_zapis.open("xor.txt", ios::trunc | ios::binary);
    plik_zapis.write(bufor, dlugosc);
    plik_zapis.close();
    delete [] bufor;
    delete [] klucz_char;
    return 0;
}

w pliku niestety wciąż pojawiają mi się dziwne znaki - czy tak powinno być? Niemniej jednak szyfrowanie działa, zweryfikowałem to odszyfrowując pierwotny plik. Dodatkowe pytanie - czy jeśli pozostawię klucz jako string, a nie przekonwertuję go do tablicy char, szyfrowanie będzie odbywać się poprawnie? 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+2 głosów
2 odpowiedzi 593 wizyt
pytanie zadane 16 kwietnia 2021 w SPOJ przez manjaro Nałogowiec (37,420 p.)
0 głosów
0 odpowiedzi 443 wizyt
pytanie zadane 24 października 2020 w C i C++ przez FaloY Bywalec (2,180 p.)
0 głosów
2 odpowiedzi 879 wizyt
pytanie zadane 2 października 2021 w C i C++ przez Michał F Nowicjusz (120 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,327 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...