Шифрование и дешифрование файла в c - PullRequest
2 голосов
/ 28 июля 2011

Здесь у меня есть простой код для шифрования и дешифрования файла в C, как показано ниже,

#include <stdio.h>
int Encrypt(char * FILENAME, char * NEW_FILENAME)    
{
    FILE *inFile;   //Declare inFile
    FILE *outFile;  //Declare outFile
    char Byte;
    char newByte;
    int n;
    int i=0;

    inFile = fopen(FILENAME,"rb");
    outFile = fopen(NEW_FILENAME, "w");

    if(inFile == NULL || outfile == NULL){
        printf("Error in opening file");
            return 1;
    } else {
        printf("\nFile Opened, Encrypting");
        while(1){
                while ( !feof( inFile ) ){
                    Byte=fgetc(inFile);
                    newByte=Byte+25;
                    fputc(newByte,outFile);
                } 
            printf("End of File");
            break;
        }
        fclose(inFile);
        fclose(outFile);
    }
}

int Decrypt (char *FILENAME, char *NEW_FILENAME)
{
    FILE *inFile; //Declare inFile
    FILE *outFile; //Declare outFile

    char Byte;
    char newByte;
    int i=0;

    inFile = fopen(FILENAME,"rb");
    outFile = fopen(NEW_FILENAME, "w");

    if(inFile == NULL || outfile == NULL){
        printf("Error in opening file");
        return 1;
    } else {
        printf("File Opened, Decrypting");
        while(1){
            printf(".");
            while ( !feof( inFile ) ){
                Byte=fgetc(inFile);
                newByte=Byte-25;
                fputc(newByte,outFile);
            } 
            printf("End of File");
            break;
        }
        fclose(inFile);
        fclose(outFile);
    }
}

int main()
{
    char encFile[200];
    char newencFile[200];
    char decFile[200];
    char newdecFile[200];

    int choice;

    printf("Enter 1 to Encrypt  / 2 to Decrypt");
    scanf("%d",&choice);

    switch(choice)
    {
    case 1:
        printf("Enter the Source Filename:  ");
        scanf("%s",encFile);
        printf("Enter the Destination Filename:   ");
        scanf("%s",newencFile);
        Encrypt(encFile, newencFile);
        break;
    case 2:
        printf("Enter the Source Filename:   ");
        scanf("%s",decFile);
        printf("Enter the Destination Filename:   ");
        scanf("%s",newdecFile);
        Decrypt(decFile, newdecFile);
        break;
    }
    return 0;
}

Этот код работает, но в конце файла он также содержит "ÿæ" таких символов, чтобы он мог 't открывается в текстовом редакторе по умолчанию в linux & становится бесполезным для хранения личных данных.Я хочу получить то же самое обратно в файл сценария.Пожалуйста, помогите за то же самое, заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 28 июля 2011

Ваш код неверен. Вы, вероятно, ожидаете, что зашифрованный файл имеет тот же размер, что и исходный файл, но это не так. Неисправный код:

    while(1){
        printf(".");
        while ( !feof( inFile ) ){
            Byte=fgetc(inFile);
            newByte=Byte+25;
            fputc(newByte,outFile);
         } 
         printf("End of File");
         break;
    }

Вместо этого должно быть:

while ((Byte = fgetc(inFile)) != EOF) {
  newByte = Byte + 25;
  if (fputc(newByte, outFile) == EOF) {
    /* ERROR */
  }
}
printf("End of File\n");

Обратите внимание, что оператор printf заканчивается символом новой строки (\n). Это стиль, которому вы должны следовать. В противном случае выходные данные могут отображаться не сразу из-за буферизации.

Еще несколько подробностей: функция feof только проверяет, установлен ли конец маркера файла . Но когда функция fgetc замечает, что она достигла конца файла, этот маркер еще не был установлен. Вместо этого функция fgetc возвращает EOF в этом случае.

О, и, пожалуйста, измените типы ваших переменных.

char Byte; /* this is wrong. */
int Byte; /* this is correct. */

Подробности см. В любой хорошей вводной книге по программированию на Си.

2 голосов
/ 29 октября 2012

Как насчет этой новой программы, которая использует другую логику:

#include <stdio.h>
int main()
{
    char src[50], tgt[53], ch;
    printf ("Enter file name: ");
    gets (src);
    fs = fopen (src, "r");
    if (fs == NULL)
    {
        printf ("Error while opening file!\n");
        return 1;
    }
    sprintf (tgt, "%s.ed", src);
    ft = fopen (tgt, "w");
    while ((ch = fgetc (fs)) != EOF)
        fputc (~ch, ft);
    fclose (fs);
    fclose (ft);
    remove (src);
    rename (tgt, src);
    return 0;
}

Нет необходимости писать отдельные функции / программы для обеих целей. Кроме того, тот же файл будет зашифрован путем печати дополнения файла к другому файлу и переименования нового в более старый после удаления более старого.
В целом: это очень простая утилита!

2 голосов
/ 28 июля 2011

Прежде чем я объясню решение вышеприведенного кода, Позвольте мне рассказать вам эти вещи в первую очередь. Остерегайтесь ненужного определения переменных в вашей программе. Я вижу много потерь памяти в вашем коде. Каждый может написать программу, но тот, кто делает ее проще, получает корону. Помните об этом, когда вы работаете над программированием.

Я вижу ненужную переменную i, определение в ваших функциях Encrypt и Decrypt. и нет необходимости переходить к определению нового байтового символа. Вы можете отсортировать его как

   byte=byte+25 \\ even that makes your work no need of Newbyte char variable.

Сотрите определения int n, int i, чтобы сделать ваш код лучше. И самое важное, что вы действительно должны знать, это

    you cannot use char a;a=getc(Filepointer);

помните, что EOF возвращает -1, когда достигает конца файла и если вы используете char. Он не работает. Тип данных Char может обрабатывать только положительные данные. Даже если вы назначите -1 для char, он внутренне сохранит его как положительное число, которое вы можете проверить в Google.

      so never use char data type for checkin EOF use int datatype 

и, как упоминал Рональд, вы делаете это как

       while((Byte=getc(Filepointer))!=EOF)

Это ошибка, которую вы сделали. Сделайте это типом данных типа int. И, пожалуйста, проверьте предыдущие вопросы. Выполните, на самом деле, дублирующий вопрос. Некоторые люди могут относиться к ним как к отрицательным.

Лучшим стилем шифрования и дешифрования является использование побитовых операций, а не сложение

            Byte=Byte^200; To encrypt  \\ just a sample 
            Byte=Byte^200; To  decrypt \\ you can make more complicated

Вот как ты должен это сделать. Это дает вам большую безопасность по сравнению с добавлением 25 к вашему символу ACSII. Вы можете даже зашифровать его, задав некоторые предопределенные правила. Надеюсь, вы получили ответ и решили свою проблему. Спасибо

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