Проблемы с шифрованием файла

#c #file #security #encryption

#c #файл #Безопасность #шифрование

Вопрос:

Я пытался зашифровать файл из файла заголовка, и каждый раз, когда я запускаю программу, она удаляет информацию в файле AccountInformation.txt . Есть ли какая-либо причина, по которой он удаляет информацию из AccountInformation.txt и как я могу исправить свой код?

Любая помощь будет большой, спасибо.

Ниже приведен код c:

 #include <stdio.h>
#include <string.h>
#include "Encryption1.h"


// Variable for signup and login
char fname[120], lname[120], username[120], password[120]; 
int session;
FILE * accountInfoPointer;
// Main Fucntion for sign up and login

int main (void)
{
  // Asking user is they want to sign up or login
  printf("What would you like to do?n");
  printf("1. Sign un");
  printf("2. Loginn"); 
  printf("3. Admin login");
  scanf("%d", amp;session);
  
  // signup
  switch(session)
  {
    case 1:
      // Retreiving all of the user's data 
      
      printf("What is your FIRST name?n");
      scanf(" %s", fname);

      printf("What is your LAST name?n");
      scanf(" %s", lname);

      printf("Please enter a username?n");
      scanf(" %s", username);

      printf("Create a passwordn");
      scanf(" %s", password);

              accountInfoPointer = fopen("AccountInformation.txt", "a");
              
              fprintf(accountInfoPointer, "Name: %s %snUsername: %snPassword: %snn", fname, lname, username, password);
              
              fclose(accountInfoPointer); 
     
     
      goto Encrypt; //goes to calender menu 

    Encrypt:{ 
    //char Title;{ 
   printf("nntttt::::::Encrypt::::::n");  
 encrypted1(1);       
 
    } 
 break;      


     
  }
  } 
 

Это код файла заголовка:

 #include<stdio.h>
#include<stdlib.h>
 
int encrypt(void);
int decrypt(void);
int encrypt_view(void);
int decrypt_view(void);
 
FILE *fp1, *fp2;
char ch;
 
void encrypted1(int Encrypt)
{
    int choice;
    while(1)
    {   
        printf("Select One of the Following:n");
        printf("n1. Encryptn");   
        printf("2. Decryptn");
        printf("3. View The Encypted Filen");
        printf("4. View The Decrypted Filen");
        printf("5. Exitn");
        printf("nEnter Your Choice:t");
        scanf("%d", amp;choice);
        switch(choice)
        {
            case 1: encrypt();
                break;
            case 2: decrypt();
                break;
            case 3: encrypt_view();
                break;
            case 4: decrypt_view();
                break;
            case 5: exit(1);
        }
    }
    printf("n");
   // return 0;
}
 
int encrypt()
{
    printf("n");
    fp1 = fopen("AccountInformation.txt","r");
    if(fp1 == NULL)
    {
        printf("Source File Could Not Be Foundn");
    }
    fp2 = fopen("AccountInformation.txt","w");
    if(fp2 == NULL)
    {
        printf("Target File Could Not Be Foundn");
    }
    while(1)
    {
        ch = fgetc(fp1);
        if(ch == EOF)
        {
            printf("nEnd Of Filen");
            break;
        }
        else
        {
            ch = ch - (8 * 5 - 3);
            fputc(ch, fp2);
        }
    }
    fclose(fp1);
    fclose(fp2);
    printf("n");
    //return 0;
}
 
int decrypt()
{
    printf("n");
    fp1 = fopen("AccountInformation.txt","r");
    if(fp1 == NULL)
    {
        printf("Source File Could Not Be Foundn");
    }
    fp2 = fopen("AccountInformation.txt","w");
    if(fp2 == NULL)
    {
        printf("Target File Could Not Be Foundn");
    }
    while(1)
    {
        ch = fgetc(fp1);
        if(ch == EOF)
        {
            printf("nEnd Of Filen");
            break;
        }
        else
        {
            ch = ch   (8 * 5 - 3);
            fputc(ch, fp2);
        }
    }
    fclose(fp1);
    fclose(fp2);
    printf("n");
    //return 0;
}
 
int encrypt_view()
{
    printf("n");
    fp1 = fopen("AccountInformation.txt","r");
    if(fp1 == NULL)
    {
        printf("No File Foundn");
        exit(1);
    }
    else
    {
        while(1)
        {
            ch = fgetc(fp1);
            if(ch == EOF)
            {
                break;
            }
            else
            {
                printf("%c", ch);
            }
        }
        printf("n");
        fclose(fp1);
    }
    printf("n");
    //return 0;
}
 
int decrypt_view()
{
    printf("n");
    fp1 = fopen("AccountInformation.txt","r");
    if(fp1 == NULL)
    {
        printf("No File Foundn");
        exit(1);
    }
    else
    {
        while(1)
        {
            ch = fgetc(fp1);
            if(ch == EOF)
            {
                break;
            }
            else
            {
                printf("%c", ch);
            }
        }
        printf("n");
        fclose(fp1);
    }
   // return 0;
    printf("n");
}


 

Комментарии:

1. Подсказка: проблема здесь: fopen("AccountInformation.txt","w");

2. Я меняю ‘w’ на ‘r’, ‘a’ и ‘a ‘, но информация по-прежнему удаляется.

Ответ №1:

 fp1 = fopen("AccountInformation.txt","r");
if(fp1 == NULL)
{
    printf("Source File Could Not Be Foundn");
}
fp2 = fopen("AccountInformation.txt","w");
if(fp2 == NULL)
{
    printf("Target File Could Not Be Foundn");
}
 

Я съеживаюсь от этого, но идея должна работать на производных unix. Вы искажаете свои данные, потому что вы должны были использовать «r «, но вы использовали «w». Включается как чтение, так и запись, но w выполняется усечение. Вы не хотите a . Если вы не пишете файл журнала, вы не хотите a , поэтому не пытайтесь использовать его здесь.

Комментарии:

1. Мне жаль, что ты съеживаешься от этого, лол, все еще новичок в программировании на Си. Но я использовал r , но он просто удаляет информацию в текстовом файле

2. @GamerGirl: Обычный подход заключается в расшифровке только в оперативной памяти и хранении только в зашифрованном виде на диске.

Ответ №2:

По крайней мере, эта проблема:

Невозможно правильно отличить все входные данные от fgetc()

char , будучи 8-разрядным, может кодировать 256 комбинаций. int fgetc() возвращает 257 значений: [0-UCHAR_MAX] и EOF .

Код шифрует, с ch = ch - (8 * 5 - 3); fputc(ch, fp2); помощью которого легко генерируется a char , который сталкивается с EOF последующим чтением, что делает файл скудным.

 char ch;  // Bad
ch = fgetc(fp1);
if(ch == EOF)  // Was ch an EOF or some character?
 

Используется int ch для отличия возвращаемых значений от fgetc() .


Для шифрования / дешифрования лучше открывать файлы в двоичном режиме, чем в текстовом режиме. Добавьте a "b" .

 // fp1 = fopen("AccountInformation.txt","r");
fp1 = fopen("AccountInformation.txt","rb");
 

Альтернативный пример кода:

 int encrypt_view(void) {
  printf("n");
  FILE *fp = fopen("AccountInformation.txt", "rb");
  if (fp == NULL) {
    printf("No File Foundn");
    return 1; // Let calling code exit
  }

  int ch;
  while ((ch = fgetc(fp)) != EOF) {
    if (ch >= ' ' amp;amp; ch <= '~') {
      printf("%c", ch);
    } else {
      printf("<%d>", ch);
    }
  }
  printf("n");
  fclose(fp);
  return 0;
}
 

Комментарии:

1. Спасибо, что помогли мне с encrypt_view, я вроде понимаю, что мне нужно сделать, чтобы зашифровать мой код.

2. Итак, я кодировал и использовал пример, который вы мне дали (спасибо), пытаясь закодировать мое шифрование, но я получал «двойное освобождение или повреждение (out)», когда я запускаю свой код при попытке зашифровать свой файл. ` if ((ch = fgetc(fp1) != EOF)) { ch = ch 3; printf(«%c», ch); } `