用C语言编写一个完整的程序,将一段文字写入磁盘文件《姓名》.dat保存起来。要求文件的第一部分保存文件的结构(含密钥的变形码),第二部分是文字用密钥加密的密文。文件被重新打开时要求输入密码并验证密码并限定密码的输入次数。
时间: 2024-03-19 10:46:07 浏览: 64
demo_dat输出_.dat_matlab_DEMO_
好的,以下是一个完整的程序,可以实现将一段文字写入磁盘文件并加密保存,然后读取文件并输入密码进行验证并解密得到原始的文本。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME "test.dat"
#define MAX_TEXT_SIZE 1024
#define MAX_KEY_SIZE 256
typedef struct {
char fileName[256];
int fileSize;
char key[MAX_KEY_SIZE];
} FileHeader;
char* encryptText(char* text, char* key);
void writeFileHeader(char* fileName, char* key, char* text);
void writeEncryptedText(char* fileName, char* key, char* text);
char* readText(char* fileName);
char* decryptText(char* text, char* key);
int main() {
char text[MAX_TEXT_SIZE];
printf("请输入要写入文件的文本:");
fgets(text, MAX_TEXT_SIZE, stdin);
strtok(text, "\n");
char key[MAX_KEY_SIZE];
printf("请输入密钥:");
fgets(key, MAX_KEY_SIZE, stdin);
strtok(key, "\n");
writeFileHeader(FILE_NAME, key, text);
writeEncryptedText(FILE_NAME, key, text);
printf("文件已保存,请输入密码进行解密:");
char password[MAX_KEY_SIZE];
fgets(password, MAX_KEY_SIZE, stdin);
strtok(password, "\n");
char* decrypted = readText(FILE_NAME);
if (strcmp(decrypted, "") == 0) {
printf("文件不存在或格式不正确!\n");
exit(0);
}
if (strcmp(decrypted, text) == 0) {
printf("密码正确!解密得到文本:%s\n", decrypted);
} else {
printf("密码错误!\n");
}
free(decrypted);
return 0;
}
char* encryptText(char* text, char* key) {
char* result = (char*)malloc(strlen(text) + 1);
memset(result, 0, strlen(text) + 1);
for (int i = 0; i < strlen(text); i++) {
result[i] = text[i] ^ key[i % strlen(key)];
}
return result;
}
void writeFileHeader(char* fileName, char* key, char* text) {
FILE* fout = fopen(fileName, "wb");
if (fout == NULL) {
printf("文件打开失败!\n");
exit(0);
}
FileHeader header;
strcpy(header.fileName, fileName);
header.fileSize = strlen(text);
strcpy(header.key, key);
fwrite(&header, sizeof(header), 1, fout);
fclose(fout);
}
void writeEncryptedText(char* fileName, char* key, char* text) {
FILE* fout = fopen(fileName, "ab");
if (fout == NULL) {
printf("文件打开失败!\n");
exit(0);
}
char* encrypted = encryptText(text, key);
fwrite(encrypted, strlen(encrypted), 1, fout);
fclose(fout);
free(encrypted);
}
char* readText(char* fileName) {
FILE* fin = fopen(fileName, "rb");
if (fin == NULL) {
return "";
}
FileHeader header;
fread(&header, sizeof(header), 1, fin);
int n = 3; // 最多输入密码的次数
while (n--) {
printf("请输入密码(还有%d次机会):", n);
char password[MAX_KEY_SIZE];
fgets(password, MAX_KEY_SIZE, stdin);
strtok(password, "\n");
if (strcmp(password, header.key) == 0) {
break;
}
if (n == 0) {
printf("密码错误次数过多,程序退出!\n");
exit(0);
}
printf("密码错误,请重试!\n");
}
fseek(fin, sizeof(header), SEEK_SET);
char buf[MAX_TEXT_SIZE];
char* encrypted = (char*)malloc(header.fileSize + 1);
memset(encrypted, 0, header.fileSize + 1);
int offset = 0;
while (offset < header.fileSize) {
int len = fread(buf, 1, sizeof(buf), fin);
for (int i = 0; i < len; i++) {
encrypted[offset + i] = buf[i];
}
offset += len;
}
char* decrypted = decryptText(encrypted, header.key);
fclose(fin);
free(encrypted);
return decrypted;
}
char* decryptText(char* text, char* key) {
char* result = (char*)malloc(strlen(text) + 1);
memset(result, 0, strlen(text) + 1);
for (int i = 0; i < strlen(text); i++) {
result[i] = text[i] ^ key[i % strlen(key)];
}
return result;
}
```
在运行程序时,会先要求输入要写入文件的文本和密钥,然后将文本加密保存到磁盘文件中。接着,会要求输入密码进行解密,并将解密得到的文本输出。如果输入的密码错误次数超过了3次,则程序会提示密码错误次数过多并退出。
阅读全文