这是我写的第一个 C 语言项目,基本功能已经完善,作为第一个项目,后续我会慢慢将其完善,并添加更多的功能
-
版本:
Ver 1.0.1 -
程序功能:
对文本文件进行加密、解密操作
- 已知问题:
- 无法判断用户打开文件是否属于文本文件,如果对一个非文本文件进行加密解密操作会对文件造成损坏
- 用户输用输入无效文件路径,程序抛出异常终止
- 密码只支持数字加密,不支持字母和特殊字符
- 如果用户忘记密码无法对已加密文件进行解密
# 程序代码
该程序包含 6 个源文件,下面对每个源文件进行说明
- print_help.c
打印程序帮助信息
- get_file_path.c
获取加密文件路径和保存文件路径
- read_src_file.c
获取源文件首地址
- file_text_encrypt.c
对文件进行加密
- file_text_decrypt.c
对文件进行解密
- save_file.c
保存加密、解密后的文件路径
# main.c
#include <stdio.h> | |
#include "encryption.h" | |
int main(int argc, char* argv[]) | |
{ | |
while (1) | |
{ | |
int cmd = 0; | |
print_help(); | |
printf("请输入需要操作的指令:"); | |
scanf_s("%d", &cmd); | |
getchar(); | |
if (cmd == 1) | |
{ | |
char dest_file_name[64]=""; | |
char src_file_name[64]=""; | |
int password=0; | |
unsigned long file_length = 0; | |
char* str = NULL; | |
// 获取加密文件路径和保存文件路径 | |
get_file_path(dest_file_name, src_file_name); | |
// 获取源文件首地址 | |
str=read_src_file(&file_length,src_file_name); | |
// 获取密码 | |
printf("请输入密码(仅支持数字):"); | |
scanf_s("%d", &password); | |
// 对文件进行加密 | |
str=file_text_encrypt(str, file_length, password); | |
// 保存加密后的文件 | |
save_file(str, file_length, dest_file_name); | |
} | |
else if (cmd == 2) | |
{ | |
char dest_file_name[64] = ""; | |
char src_file_name[64] = ""; | |
int password = 0; | |
unsigned long file_length = 0; | |
char* str = NULL; | |
// 获取加密文件路径和保存文件路径 | |
get_file_path(dest_file_name, src_file_name); | |
// 获取源文件首地址 | |
str = read_src_file(&file_length, src_file_name); | |
// 获取密码 | |
printf("请输入解密密码:"); | |
scanf_s("%d", &password); | |
// 对文件进行解密 | |
str = file_text_decrypt(str, file_length, password); | |
// 保存解密后的文件 | |
save_file(str, file_length, dest_file_name); | |
} | |
else if (cmd == 3) | |
{ | |
break; | |
} | |
else | |
{ | |
printf("请输入正确的数字!\n"); | |
} | |
} | |
return 0; | |
} |
# print_help.c
#include <stdio.h> | |
void print_help(viod) | |
{ | |
printf("************************************************\n"); | |
printf("* 1.加密文件 *************\n"); | |
printf("* 2.解密文件 *************\n"); | |
printf("* 3.退出程序 *************\n"); | |
printf("************************************************\n"); | |
return; | |
} |
# get_file_path.c
#include <stdio.h> | |
void get_file_path(char* dest_file_path, char* src_file_path) | |
{ | |
printf("请输入源文件的完整路径:"); | |
scanf_s("%s", src_file_path,64); | |
getchar(); | |
printf("请输入保存文件的完整路径:"); | |
scanf_s("%s", dest_file_path,64); | |
getchar(); | |
printf("\n"); | |
return; | |
} |
# read_src_file.c
#include <stdio.h> | |
#include <stdlib.h> | |
char* read_src_file(unsigned long* file_length, char* src_file_path) | |
{ | |
char* data = NULL; | |
FILE* fp = NULL; | |
if ((fp = fopen(src_file_path, "r")) == NULL) | |
{ | |
printf("打开%s失败\n", src_file_path); | |
fclose(fp); | |
main(); | |
} | |
fseek(fp, 0, 2); | |
*file_length = ftell(fp); | |
rewind(fp); | |
data = (char*)calloc(1, *file_length); | |
if (data == NULL) | |
{ | |
perror("calloc"); | |
return NULL; | |
} | |
fread(data, *file_length, 1, fp); | |
fclose(fp); | |
return data; | |
} |
# file_text_encrypt.c
char* file_text_encrypt(char* src_file_text, unsigned long length, unsigned int password) | |
{ | |
int i = 0; | |
for (i=0;i < length; i++) | |
{ | |
src_file_text[i] += password; | |
} | |
return src_file_text; | |
} |
# file_text_decrypt.c
char* file_text_decrypt(char* src_file_text, unsigned long length, unsigned int password) | |
{ | |
int i = 0; | |
for (i = 0; i < length; i++) | |
{ | |
src_file_text[i] -= password; | |
} | |
return src_file_text; | |
} |
# save_file.c
#include <stdio.h> | |
#include <stdlib.h> | |
void save_file(char* text, unsigned long length, char* file_name) | |
{ | |
FILE *fp = NULL; | |
if ((fp = fopen(file_name, "w")) == NULL) | |
{ | |
printf("打开%s失败\n", file_name); | |
free(text); | |
fclose(fp); | |
main(); | |
} | |
fwrite(text, length, 1, fp); | |
fclose(fp); | |
free(text); | |
printf("save success\n"); | |
return; | |
} |
# 运行效果
- 先创建一个测试文本文件
- 打开程序进行加密操作,操作完打开加密后的文件看看是否成功
- 可以看到文件加密后打开已经显示乱码了,下面对文件进行解密操作看看是否成功
# 后续
可以看到该程序的文件加密解密功能是能够正常使用的
以后有机会我会尽量把这个程序完善,给它加个好看的程序窗口,输入文件改成文件浏览器窗口选择,支持新建加密文件,限定只能选择和保存成文本文件 ,对密码进行一个加密,然后存储到一个隐藏目录,防止用户将来忘记密码导致文件数据无法恢复
由于目前我还是个小白,暂时就只想到这些,以后随着对 C 语言的掌握熟练后再对其进行优化