文件加密与解密

项目提示:
1:打开文件的时候用二进制方式打开进行读写。
2:测文件大小方法:
1)用fseek() 定位流指针到文件的末尾。
2)用ftell()函数测流指针的位置即文件的大小。
3:读文件内容:
1)根据文件的大小用malloc申请内存空间保存读出的内容
2)读文件数据的时候要从文件的开始读(rewind())。
详细设计API设计参考:

  1. 从键盘获取源文件和目的文件名字
    //
    //函数功能:获取 目的文件和源文件的名字
    //参数: src_file_name:源文件名字字符数组首地址。
    // dest_file_name:目的文件的名字字符数组首地址
    /
    /
    void get_file_name(char * dest_file_name,char * src_file_name)

  2. 从文件中读出内容
    //
    //函数功能:读出文件内容
    //参数:file_length:整型指针,此地址中保存文件字节数。
    // src_file_name:文件名字,从此文件中读取内容。
    // 返回值:读出字符串的首地址char* read_src_file(unsigned long int* file_length, char* src_file_name)
    // 在此函数中测文件的大小,并malloc空间,再把文件内容读出返回,读出字符数组的首地址
    /
    /
    char * read_src_file(unsigned long int *file_length,char *src_file_name)

  3. 字符数组加密
    //
    //函数功能:加密字符串
    //参数:
    // src_file_text:要加密的字符串。 length:字符串的长度
    // password: 加密密码
    // 返回值: 加密后的字符串的首地址
    // 加密原理字符数组中每个元素加上password
    /
    /
    char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)

  4. 解密字符串
    //
    //函数功能:解密字符串
    //参数:
    // src_file_text:要解密的字符串。 length:字符串的长度
    // password: 解密密码
    // 返回值: 解密后的字符串的首地址
    //思想;把数组中的每个元素减去password 给自己赋值。
    /
    /
    char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned int password)

  5. 保存文件
    //
    //函数功能:将字符串保存到目的文件中
    //参数:
    // text:要保存的字符串首地址
    // file_name :目的文件的名字
    // length:字符串的长度
    //思想:传入字符数组的首地址和数组的大小及保存后的文件的名字,即可保存数组到文件中
    /
    /
    void save_file(char* text,unsigned long int length,char * file_name)

  6. 打印文件信息
    //
    //
    // 函数功能:打印帮助信息
    //
    //
    /
    /
    void print_help()
    {
    printf(“1:加密文件***\n”);
    printf(“2:解密文件***\n”);
    printf(“3:退出程序***\n”);
    }

代码如下
main.c

#include
#include"fun.h"

int main(int argc, char* argv[])
{
	while(1)
	{
		int cmd = 0;
		print_help();

		scanf("%d", &cmd);

		if (cmd == 1)
		{
			char src_file_name[31] = "";
			char dest_file_name[31] = "";
			char* file_data = NULL;
			unsigned long file_length = 0;
			unsigned int passwd = 0;

			//1.从键盘获取源文件和目的文件名字
			get_file_name(dest_file_name, src_file_name);

			//2.获取源文件名对应的文件 内容
			//char* read_src_file(unsigned long int* file_length, char* src_file_name)
			file_data = read_src_file(&file_length, src_file_name);

			//3.获取用户输入的密码(自定义实现实现)
			printf("请输入密码:");
			scanf("%u", &passwd);

			//4.对文件内容加密(参考api实现)
			//char* file_text_encrypt(char* src_file_text, unsigned long int length, unsigned int password)
			file_data = file_text_encrypt(file_data, file_length, passwd);

			//5.将加密好的文件内容保存到目的文件名中
			//void save_file(char* text,unsigned long int length,char * file_name)
			save_file(file_data, file_length, dest_file_name);
		}
		else if(cmd == 2)
		{
			char src_file_name[31] = "";
			char dest_file_name[31] = "";
			char* file_data = NULL;
			unsigned long file_length = 0;
			unsigned int passwd = 0;

			//1.从键盘获取源文件和目的文件名字
			get_file_name(dest_file_name, src_file_name);

			//2.获取源文件名对应的文件 内容
			//char* read_src_file(unsigned long int* file_length, char* src_file_name)
			file_data = read_src_file(&file_length, src_file_name);

			//3.获取用户输入的密码(自定义实现实现)
			printf("请输入密码:");
			scanf("%u", &passwd);

			//4.对文件内容解密(参考api实现)
			//char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned int password)
			file_data = file_text_decrypt(file_data, file_length, passwd);

			//5.将加密好的文件内容保存到目的文件名中
			//void save_file(char* text,unsigned long int length,char * file_name)
			save_file(file_data, file_length, dest_file_name);
		}
		else if (cmd == 3)
		{
			break;
		}
		else
		{
			printf("请输入一个正确的选项\n");
		}
	}
	return 0;
}

fun.c

#include
#include

void print_help(void)
{
	printf("**************************\n");
	printf("*       1:加密文件       *\n");
	printf("*       2:解密文件       *\n");
	printf("*       3:退出程序       *\n");
	printf("**************************\n");
}

void get_file_name(char* dest_file_name, char* src_file_name)
{
	printf("请输入你的源文件名称(30字符):");
	scanf("%s", src_file_name);
	printf("请输入你的目标文件名称(30字符):");
	scanf("%s", dest_file_name);
	return;
}

char* read_src_file(unsigned long int* file_length, char* src_file_name)
{
	char* data = NULL;
	FILE* fp = NULL;
	fp = fopen(src_file_name, "r");
	if (fp == NULL) 
	{
		perror("fopen");
		return NULL;
	}

	//获取文件总长度
	//将文件流指针定位到文件尾部
	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;
}

char* file_text_encrypt(char* src_file_text, unsigned long int length, unsigned int password)
{
	int i = 0;
	for (i = 0; i < length; i++)
	{
		src_file_text[i] += password;//加密过程
	}
	return src_file_text;
}

void save_file(char* text, unsigned long int length, char* file_name)
{
	FILE* fp = NULL;
	fp = fopen(file_name, "w");
	if (fp == NULL)
	{
		perror("fopen");
		return;
	}

	//将data数据保存到文件中
	fwrite(text, length, 1, fp);

	fclose(fp);

	//释放text指向的堆区空间
	if (text != NULL)
	{
		free(text);
		text = NULL;
	}

	printf("sava sucess!\n");
	return;
}

char* file_text_decrypt(char* src_file_text, unsigned long int length, unsigned int password)
{
	int i = 0;
	for (i = 0; i < length; i++)
	{
		src_file_text[i] -= password;//解密过程
	}
	return src_file_text;
}

fun.h

#ifndef __FUN_H__
#define __FUN_H__

extern void print_help(void);
extern void get_file_name(char* dest_file_name, char* src_file_name);
extern char* read_src_file(unsigned long int* file_length, char* src_file_name);
extern char* file_text_encrypt(char* src_file_text, unsigned long int length, unsigned int password);
extern void save_file(char* text, unsigned long int length, char* file_name);
extern char* file_text_decrypt(char* src_file_text, unsigned long int length, unsigned int password);
#endif

运行结果如下文件加密与解密_第1张图片文件加密与解密_第2张图片

你可能感兴趣的:(c语言)