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

Szyfr XOR na pliku

Object Storage Arubacloud
0 głosów
257 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,320 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 326 wizyt
pytanie zadane 16 kwietnia 2021 w SPOJ przez manjaro Nałogowiec (37,390 p.)
0 głosów
0 odpowiedzi 139 wizyt
pytanie zadane 24 października 2020 w C i C++ przez FaloY Bywalec (2,180 p.)
0 głosów
2 odpowiedzi 410 wizyt
pytanie zadane 2 października 2021 w C i C++ przez Michał F Nowicjusz (120 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...