funkcja szyfrujaca XOR

0

Cześć napisałem funkcje, która pobiera od użytkownika tekst do stringa, następnie zamienia go na ASCII tego z kolei na postać binarną. Tworze losową zmienną całkowitą z zakresu od 0-255, zamieniam ją na postać binarną i wykorzystuje do operacji XOR jako klucza. Dalej to co otrzymałem po operacji XOR zamieniam z postaci binarnej na ASCII, wrzucam do stringa i zapisuje do pliku. Moja prośba polega na sprawdzeniu kodu, oraz wskazaniu mi ewentualnych błędów w projekcie funkcji. Mam wrażenie, że zabiłem wydajność....oraz że kod mógłby być o wiele krótszy.... Proszę o wypowiedź ;)


srand(time(0));
    pass = rand()%256;

    cout<< "Wpisz tekst: ";
    getline(cin, tmp_str);
    size = tmp_str.size();

    int tmp_int[size];
    for (int i=0; i<size; i++)
        tmp_int[i] = char(tmp_str[i]);
    cout<<endl;

    int bin[size][8];
    int binary[8];
    for(int j=0; j<size; j++) {

        int asci = tmp_int[j];
        for (int i=0; i<8; i++) {
            binary[i] = asci % 2;
            asci = (asci - binary[i]) / 2;
        }
        for (int i=7; i>=0; i--)
            bin[j][i] = binary[i];
    }

    unsigned int password[8];
    for (int i=0; i<8; i++) {
        password[i] = pass % 2;
        pass = (pass - password[i]) / 2;
    }

    //operacja XOR------------operacja XOR------------operacja XOR
    cout<<endl;
    for (int j=0; j<size; j++) {
        for (int i=7; i>=0; i--)
            bin[j][i] = bin[j][i] ^= password[i];
    }
    //operacja XOR------------operacja XOR------------operacja XOR


    unsigned int pot2[8] = {128, 64, 32, 16, 8, 4, 2, 1};
    unsigned int result[size];
    for(int j=0; j<size; j++) {
        result[j] = 0;
        for (int i=7; i>=0; i--) {
            if (bin[j][i] == 1)
                result[j] = result[j] + pot2[8-(i+1)];
            else result[j] = result[j];
        }
    }

    string tmp_file;
    for (int i=0; i<size; i++)
        tmp_file += char(result[i]);


    const string txt = ".txt";
    string nazwa_pliku;
    cout<< "Podaj nazwe pliku: ";
    getline(cin, nazwa_pliku);
    nazwa_pliku += txt;

    ofstream file;
    file.open(nazwa_pliku.c_str(), ios_base::out | ios_base::app);
    file<< tmp_file <<endl;

0

xor możesz wykonać bezpośrednio na stringu. kod programu uprości się do kilku linijek - linijka na wczytanie tekstu, dwie na xor, wczytanie nazwy pliku, zapisanie - razem ze sześć.

            bin[j][i] = bin[j][i] ^= password[i];
  • o jedno = albo bin[j][i] za dużo (^= to xor z jednoczesnym przypisaniem)
    for(int j=0; j<size; j++) {
        result[j] = 0;
        for (int i=7; i>=0; i--) {
            if (bin[j][i] == 1)
                result[j] = result[j] + pot2[8-(i+1)];
            else result[j] = result[j];
        }
    }
  • WTF? oO
 for (int i=0; i<size; i++)
        tmp_file += char(result[i]);
  • wolniej już się nie da, robisz n^2 operacji kopiowania bajta w celu przepisania n bajtów
0

Nie wiem po co zmieniasz to na bity :), operuj na bajtach, lepiej na WORD-ach, a jeszcze lepiej na DWORD-ach dla poprawienia szybkości, ogólnie najlepiej i najszybciej byś to na instrukcjach SSEx zrobił, btw przykład z mojej własnej strony http://www.stringencrypt.com/c-cpp-encryption/ (hate on) ;)

0

wiedziałem że coś jest nie tak z tym kodem ;) czyli wystarczy tak?


string save = "c++";
    unsigned int pass = 12;
    int size = save.size();
    string temp;

    for (int i=0; i<size; i++) {
        temp[i] = save[i] ^= pass;
        cout<< temp[i] <<endl;
    }

0

a powiedzcie mi jak rozwiązać problem ze zmienna losową która jest w tym przypadku moim kluczem? bo żeby później móc odszyfrować wiadomość z pliku potrzebuje właśnie klucza ale chyba nie powinienem go zapisywać w tym samym pliku? jak to powinno wyglądać?

0

[ot] przy tak banalnym szyfrowaniu nie potrzebujesz klucza ;-) wystarczy analiza ilości występowania znaków i porównania wyników ze statystyczną ilością użycia poszczególnych liter w języku polskim - klucz i odszyfrowany tekst dostaniesz w ułamku sekundy. a ponieważ masz banalny przypadek banalnego przypadku, tj. szyfrujesz jednym bajtem, to można to zrobić jeszcze prościej - sprawdzić w pętli dla jakiej liczby odszyfrowany tekst będzie zawierać tylko prawidłowe litery i znaki przestankowe. im dłuższy tekst, tym jest to bardziej banalne.
xor jest jednym z najsłabszych zabezpieczeń kryptograficznych. jest tak naprawdę skuteczny tylko wtedy, jeśli długość klucza jest w przybliżeniu równa długości szyfrowanych danych.

0
    string save = "c++";
    char pass = 12;
    for (int i=0;i<save.size();++i) cout<<(char)(save[i]^pass)<<endl;

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