这是我写的第一个 C 语言项目,基本功能已经完善,作为第一个项目,后续我会慢慢将其完善,并添加更多的功能

  • 版本:
    Ver 1.0.1

  • 程序功能:

对文本文件进行加密、解密操作

  • 已知问题:
  1. 无法判断用户打开文件是否属于文本文件,如果对一个非文本文件进行加密解密操作会对文件造成损坏
  2. 用户输用输入无效文件路径,程序抛出异常终止
  3. 密码只支持数字加密,不支持字母和特殊字符
  4. 如果用户忘记密码无法对已加密文件进行解密

# 程序代码

该程序包含 6 个源文件,下面对每个源文件进行说明

  1. print_help.c

打印程序帮助信息

  1. get_file_path.c

获取加密文件路径和保存文件路径

  1. read_src_file.c

获取源文件首地址

  1. file_text_encrypt.c

对文件进行加密

  1. file_text_decrypt.c

对文件进行解密

  1. save_file.c

保存加密、解密后的文件路径

# main.c

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;
}
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

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

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

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

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

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;
}

# 运行效果

  1. 先创建一个测试文本文件

测试文件

  1. 打开程序进行加密操作,操作完打开加密后的文件看看是否成功

加密

  1. 可以看到文件加密后打开已经显示乱码了,下面对文件进行解密操作看看是否成功

解密

# 后续

可以看到该程序的文件加密解密功能是能够正常使用的

以后有机会我会尽量把这个程序完善,给它加个好看的程序窗口,输入文件改成文件浏览器窗口选择,支持新建加密文件,限定只能选择和保存成文本文件 ,对密码进行一个加密,然后存储到一个隐藏目录,防止用户将来忘记密码导致文件数据无法恢复

由于目前我还是个小白,暂时就只想到这些,以后随着对 C 语言的掌握熟练后再对其进行优化

Edited on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

Bob WeChat Pay

WeChat Pay

Bob PayPal

PayPal

Bob Alipay

Alipay