#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); } `