Шифрование простого массива - PullRequest
0 голосов
/ 18 марта 2012

Для лаборатории, которую мне нужно сделать, мне нужно создать программу, которая будет извлекать простую строку из текстового файла и шифровать ее с помощью ключа - числа от 0 до 255. Он будет считывать файл в массив и шифрование (или дешифрование) этого массива в другой массив, XOR-каждый байт с ключом. В конце он записывает измененный массив во второй файл.

У меня в основном все получилось - то, что у меня ниже, компилируется просто отлично. Однако он ничего не копирует во второй файл. Помогите!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRYPT(a, b) (a ^ b)

int main(int argc, char *argv[])
{
    FILE *fp1, *fp2;
    int a[100], b, key;
    int i = 0;

    // opens file containing string to be encrypted
    if((fp1 = fopen(argv[2], "rb")) == NULL)
    {
            printf("Error - could not open file or file does not exist\n");
            return;
    }

    // opens file encrypted string will be saved to
    fp2 = fopen(argv[3], "wb");

    // converts string to integer
    key = atoi(argv[1]);

    while(fread(a, sizeof(a), 100, fp1))
    {
            while (i != '\0');
            {
                    b = CRYPT(a[i], key);
                    fwrite(&b, sizeof(a), 1, fp2);
                    i++;
            }
    }


    return 0;

}

Ответы [ 2 ]

0 голосов
/ 18 марта 2012

В вашем коде есть несколько серьезных недостатков.

Во-первых, переполнение буфера в массиве целых чисел a (т. Е. В a можно прочитать более 100 целых чисел).Как заметил Томас Маккарти, точка с запятой в конце цикла while создает пустое утверждение - удалите его.

Кроме того, вы пишете sizeof (a) или 100 целых чисел в fp2 для каждого символа.

0 голосов
/ 18 марта 2012

Я думаю, что проблема заключается здесь -

while (i != '\0');

Вы инициализируете i равным 0, и в цикле while вы проверяете, равен ли i NULL. Целочисленное значение NULL или \0 равно 0. В результате выражение ложно и ваш цикл никогда не выполняется.

Также удалите лишнюю точку с запятой в конце этой while петли.

Из ссылки -

size_t fread (void * ptr, size_t size, size_t count, FILE * stream);

Считывает массив count элементов, каждый размером size байтов, из stream и сохраняет их в блоке памяти, указанном ptr . Индикатор положения потока увеличивается на общее количество прочитанных байтов. Общее количество прочитанных байтов в случае успеха (размер * количество).

Так что вам также нужно изменить функцию fread на эту -

fread(a, sizeof(int), 100, fp1)

Аналогично, вам также нужно изменить fwrite -

fwrite(&b, sizeof(int), 1, fp2);

Отредактированный код должен выглядеть примерно так -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRYPT(a, b) (a ^ b)

int main(int argc, char *argv[])
{
    FILE *fp1, *fp2;
    int a[100], b, key;
    int i = 0;
    int data_read = 0;

    // opens file containing string to be encrypted
    if((fp1 = fopen(argv[2], "rb")) == NULL)
    {
            printf("Error - could not open file or file does not exist\n");
            return;
    }

    // opens file encrypted string will be saved to
    fp2 = fopen(argv[3], "wb");

    // converts string to integer
    key = atoi(argv[1]);

    while( (data_read = fread(a, sizeof(int), 100, fp1)) > 0 )
    {
            while(i < data_read)
            {
                    b = CRYPT(a[i], key);
                    fwrite(&b, sizeof(int), 1, fp2);
                    i++;
            }

            i=0;
    }

    return 0;
}
...