funkcja szyfrujaca XOR

2013-02-13 18:12

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

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;
Ale po co zamieniasz ciąg bajtów na tablice, w których trzymasz bity (w międzyczasie bezsensownie zamieniając ASCII na binarny), następnie XORujesz każdy bit z osobna i zamieniasz z powrotem na postać bajtową, którą zamieniasz na ASCII? Czy nie możesz wczytać napisu (ciągu bajtów) każdy bajt XORować z maską i wypisać? Czy ja czegoś nie rozumiem? - hfaua 2013-02-13 18:34

Pozostało 580 znaków

ŁF
2013-02-13 18:32
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 2 godziny temu

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

edytowany 2x, ostatnio: ŁF, 2013-02-13 18:34

Pozostało 580 znaków

2013-02-13 18:45

Rejestracja: 9 lat temu

Ostatnio: 1 godzina temu

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) ;)


Zdaje się, że on chciał zrobić szyfr strumieniowy, więc musi szyfrować po jednym bicie. - satirev 2013-02-13 19:43

Pozostało 580 znaków

2013-02-13 19:29

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

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;
    }
powinno być: save[i] ^ pass; Bo tak jak ty masz to zatrzesz wartość save - robcio 2013-02-13 19:48
dodatkowa zmienna temp jest zbędna, a wypisywanie po jednej literce jest nieoptymalne. - ŁF 2013-02-14 12:39

Pozostało 580 znaków

2013-02-14 09:37

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

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ć?

Pozostało 580 znaków

ŁF
2013-02-14 12:37
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 2 godziny temu

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.


rozumiem, ale chodziło mi własnie o to, że jeżeli skomplikuje to szyfrowanie lub użyje innego(mocniejszego) to chciałbym żeby ktoś z upoważnionych mógł odczytać wiadomość, a to jednak powinien zrobić za pomocą klucza ;) i teraz gdzie taki klucz się umieszcza? w tym samym pliku? w jakiej postaci? najłatwiej zrozumieć to na prostym przykładzie jakim jest XOR ;) - emacs 2013-02-14 16:05
klucz wysyłasz gołębiem - ŁF 2013-02-14 16:23
co dziwnego było w moim pytaniu? - emacs 2013-02-14 17:10
no nic. jeśli klucz umożliwiający odszyfrowanie danych dołączysz do zaszyfrowanych danych, to po co je szyfrować? klucz/hasło wysyła się osobno, na przykład przysłowiowym gołębiem. - ŁF 2013-02-14 17:18

Pozostało 580 znaków

2013-02-14 12:43

Rejestracja: 14 lat temu

Ostatnio: 3 minuty temu

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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-02-14 12:44

Pozostało 580 znaków

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