Почему моя простая программа шифрования XOR не переводит символы правильно, и почему она добавляет больше символов в конце? - PullRequest
0 голосов
/ 22 февраля 2011

Я делаю en / decryptor на основе XOR, который работает следующим образом. У вас есть открытый текст, например, 3, и пользовательский ключ, например, 5. Написано в битах:

3 = 00000011

5 = 00000101

Теперь, если мы сделаем операцию XOR, мы получим 6:

6 = 00000110

Это можно изменить, сказав 6 XOR 5, то есть 3.

Итак, я сделал эту программу. Но он действительно глючит, он не переводит текст правильно и добавляет много символов в конец файла, в зависимости от того, какой ключ вы используете.

using namespace std;
int main(int argc, char *argv[])
{
    char buffer[5001]; 
    ifstream fin("a.txt", ifstream::in);
    ofstream fout("b.txt");
    int key;
    char znak;

    // console    
    cout << "Key: ";
    cin >> key;
    fin.get(znak);
    while(!fin.eof() && znak != ' ')
    {
       fin.get(buffer, sizeof(buffer));     
    }

    for(int i = 0; i < sizeof(buffer); i++)
    {
       fout << function(key, buffer[i]);
    }

    cout << "done" << endl;

    cin.get();
    return 0;
}

char function(int key,char input)
{
    return input ^ key;
}

Почему программа не переводит текст правильно? И почему он добавляет символы в конец файла?

Ответы [ 4 ]

7 голосов
/ 22 февраля 2011

Судя по всему, шифрование здесь почти не имеет ничего общего (или, по крайней мере, с проблемой).

while(!fin.eof() && znak != ' ')

Цикл вида while (!whatever.eof()) в значительной степени гарантированноработать некорректно.

    fin.get(buffer, sizeof(buffer)); 

Когда вы делаете это, обратите внимание, что не гарантирует, что он будет читать sizeof(buffer) символов - только то, что он не будет читать больше чем это.Обычно вы получаете меньше в конце файла, когда осталось не так много символов для чтения.[Редактировать: я должен также упомянуть, что вы можете читать меньше и в других местах - например, если вы читаете по сетевому соединению, довольно часто получают частичный буфер, но позже, когдаон прибывает.]

for(int i = 0; i < sizeof(buffer); i++)

Так что здесь, когда вы пытаетесь обработать sizeof(buffer) символов, очень высоки шансы, что (особенно на последней итерации) вы пытаетесь обработать больше символов, чем вы на самом деле читали,Вы можете получить прочитанное число с помощью gcount, хотя я не уверен, что действительно рекомендую его использовать.

Лично я, вероятно, сделаю что-то вроде этого:

class function { 
    char key;
public:
    function(char k) : key(k) { }
    char operator()(char input) { return key ^ input; }
};

int main() { 
    std::ifstream fin("a.txt");
    std::ofstream fout("b.txt");

    fin.noskipws();

    std::transform(std::istream_iterator<char>(fin),
                   std::istream_iterator<char>(),
                   std::ostream_iterator<char>(fout),
                   function(key));
    return 0;
}
1 голос
/ 22 ноября 2013

я нашел в сети некоторые коды шифрования XOR, которые могут вам помочь

это красиво написанный код на c https://code.google.com/p/xorencryption/

написано на С ++ http://programmingconsole.blogspot.in/2013/10/xor-encryption-for-alphabets.html

1 голос
/ 22 февраля 2011

Вот некоторые вещи, которые я заметил:
1. Работайте в двоичном формате с типом данных unsigned char.
char или signed char может нанести ущерб вашей схеме шифрования.
Откройте файлы как binary, чтобы ОС не переводила байты:

Старый:

char buffer[5001]; 
ifstream fin("a.txt", ifstream::in);
ofstream fout("b.txt");

Исправлено:

const unsigned int BUFFER_SIZE = 4096; // Prefer multiples of 2.
ifstream fin("a.txt", ios::binary);  // ifstream::in is redundant for an ifstream
ofstream fout("b.txt", ios::binary);

Будьте совместимы с вашими типами данных.
Типы int и char могут быть разных размеров. Предпочитайте unsigned char, если хотите играть с байтами.

Ссылка: Int ключ; чар знак;

Используйте оператор ввода-вывода в качестве выражения в операторе while. Короче, eof вызывается после прочтения:

while ((fin >> znak) && (znak != ' '))
0 голосов
/ 22 февраля 2011

Внимательно посмотрите на ваш код, читающий файл в буфер.Функция get () читает самое большее количество символов, которое вы запрашиваете;это будет меньше в конце файла.Вы должны проверить, сколько фактически было прочитано с помощью gcount (), и проходить только те из них при выполнении шага шифрования.

Похоже, что вам нужна также и другая уборка.

...