Как использовать XOR для шифрования музыкального файла - PullRequest
1 голос
/ 12 августа 2010

Я хочу зашифровать и расшифровать 10000 байт музыкального файла. Я использовал код:

if(file!=NULL && g!= NULL)  
{
    while(!feof(file))
    {
        count++;
        char aByte;
        fread(&aByte, sizeof(char), 1, file);
        if (count <= 10000)
        {
            if (count % 2 == 0)
            {
                if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
            }
            else 
            {
                if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
            }
        }
        fwrite(&aByte, sizeof(char), 1, g);
    }
}   
fclose(file);

Но код не работает. Пожалуйста, помогите !!!

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

Вы не должны делать XOR, когда проверяете EOF (что, кстати, fread указывает на его возвращаемое значение, а не на значение, которое оно записывает в ваш буфер);только когда вы готовите байт для записи в файл.

Кроме того, вам понадобится гораздо более длинный ключ, если вы хотите правильно его зашифровать - и ключ должен быть неизвестен всем, кто не 'Я должен был быть в состоянии расшифровать его.

1 голос
/ 12 августа 2010

Проверьте вашу обработку файлов, сняв «шифрование».Уберите эти строки

        if (count % 2 == 0)
        {
            if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
        }
        else 
        {
            if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
        }

Ваш файл точно такой же?Я думаю, что это не будет.Вот несколько причин

  1. Файл длиннее 10 000 байт - вы закрываете файл в конце, поэтому я предполагаю, что эти байты потеряны
  2. Файл меньше 10 000 байт- вы не проверяете свойство EOF, поэтому похоже, что будет записан дополнительный байт
  3. count не инициализируется в этом коде - если он нечетный при одном запуске и даже при другом, он не будет 'матч.Кроме того, он просто скопирует случайное количество байтов в зависимости от того, что это за счет.Возможно, он инициализирован в другом месте.
  4. Вы не закрываете g, поэтому вы не можете быть уверены, что он был сброшен (fwrite может записывать в буфер)

UPDATE: EOF не является байтомчто вы можете найти в файле, это специальное возвращаемое значение, используемое некоторыми функциями API FILE (не fread).

Функция getchar () определяется следующим образом:

  int getchar();

Itлибо возвращает EOF, либо int, находящийся в диапазоне char.Если это EOF, то это означает, что вы находитесь в конце файла.Если нет, вы можете смело использовать возвращение к персонажу.Единственное условие для EOF - это то, что он не является действительным символом.getchar () возвращает int, потому что он может вернуть любой символ (256 вариантов) + EOF, что в сумме дает 257 вариантов, которые не могут быть представлены в char.

Если вы посмотрите на fread (), вы увидитеВидите, это не имеет ничего общего с символами.Он принимает буфер и размер записи, а также количество записей и возвращает количество прочитанных байтов.Вы проходите мимо sizeof (char) и 1, чтобы получить char.Он не может хранить EOF в этом символе, потому что EOF не является действительным символом, это int и не подходит.Он не использует те же соглашения, что и getchar ().Если он встречает EOF, он возвращает число меньше, чем общее количество запрошенных байтов.В вашем случае это 0. Если fread () возвращает 0, проверьте feof () и ferror (), чтобы узнать, попали ли вы в конец файла или получили ошибку (оба приводят к тому, что fread возвращает меньше запрошенного числа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...