Генерация случайного ASCII - PullRequest
0 голосов
/ 06 сентября 2011

Я пытался работать над очень простой процедурой шифрования, она должна работать так:

- Создать случайный ключ из символов ASCII (просто перестановка таблицы ascii)
- Для каждого символа в файле, который необходимо зашифровать, получите его десятичное представление (X), а затем замените его символом в индексе X на ключе.

Проблема в том, что он повреждает некоторые файлы, и я понятия не имею, почему.
Любая помощь будет оценена.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
    int  temp,used[256];
    char *key,*mFile;
    long i,fSize;

    memset(used,0,sizeof(used));

    srand(time(NULL));

    FILE *pInput = fopen("Input.in","rb");
    FILE *pOutput = fopen("Encrypted.out","wb");
    FILE *pKeyOutput = fopen("Key.bin","wb");

    if(pInput==NULL||pOutput==NULL||pKeyOutput==NULL)
    {
        printf("File I/O Error\n");
        return 1;
    }
    key = (char*)malloc(255);
    for(i=0;i<256;i++)
    {
        temp = rand()%256;
        while(used[temp])
            temp = rand()%256;
        key[i] = temp;
        used[temp] = 1;
    }
    fwrite(key,1,255,pKeyOutput);

    fseek(pInput,0,SEEK_END);
    fSize = ftell(pInput);
    rewind(pInput);

    mFile = (char*)malloc(fSize);
    fread(mFile,1,fSize,pInput);

    for(i=0;i<fSize;i++)
    {
        temp = mFile[i];
        fputc(key[temp],pOutput);
    }

    fclose(pInput);
    fclose(pOutput);
    fclose(pKeyOutput);
    free(mFile);
    free(key);
    return 0;
}



Процедура расшифровки:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int  temp,j;
    char *key,*mFile;
    long i,fSize;

    FILE *pKeyInput = fopen("key.bin","rb");
    FILE *pInput = fopen("Encrypted.out","rb");
    FILE *pOutput = fopen("Decrypted.out","wb");

    if(pInput==NULL||pOutput==NULL||pKeyInput==NULL)
    {
        printf("File I/O Error\n");
        return 1;
    }

    key = (char*)malloc(255);
    fread(key,1,255,pKeyInput);

    fseek(pInput,0,SEEK_END);
    fSize = ftell(pInput);
    rewind(pInput);
    mFile = (char*)malloc(fSize);
    fread(mFile,1,fSize,pInput);

    for(i=0;i<fSize;i++)
    {
        temp = mFile[i];
        for(j=0;j<256;j++)
        {
            if(key[j]==temp)
                fputc(j,pOutput);
        }
    }

    fclose(pInput);
    fclose(pOutput);
    fclose(pKeyInput);
    free(mFile);
    free(key);
    return 0;
}

1 Ответ

2 голосов
/ 06 сентября 2011

Убедитесь, что вы используете unsigned char; если char подписано, то при обработке символов в диапазоне 0x80..0xFF все пойдет не так. В частности, вы будете получать доступ к отрицательным индексам в своей «таблице сопоставления».

Конечно, строго говоря, ASCII - это 7-битный кодовый набор, и любой символ вне диапазона 0x00..0x7F не является ASCII.


Вы выделяете только 255 байтов, но затем продолжаете перезаписывать один байт сверх того, что вы выделяете. Это базовое переполнение буфера; вы вызываете неопределенное поведение (что означает, что что-то может произойти, включая вероятность того, что оно работает правильно, не вызывая проблем - на некоторых машинах).

Другая проблема заключается в том, что вы пишете сопоставления для 255 из 256 возможных байтовых кодов, что вызывает недоумение. Что происходит с другим байтовым значением?

Конечно, поскольку вы записываете 256-байтовое сопоставление в «зашифрованный» файл, декодирование будет детской игрой; безопасность в этой схеме незначительна. Однако, как упражнение по программированию, оно все же имеет некоторые достоинства.

Нет оснований глотать весь файл и затем записывать его побайтово. Вы можете прекрасно прочитать его побайтно, а также записать его побайтно. Или вы можете вырвать весь файл, отобразить его на месте, а затем записать весь файл за один раз. Согласованность важна в программировании.

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