C 语法 - 12_文件之加密器制作

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//打印帮助
void print_help();

//加密文件
void encrypted_file();

//解密文件
void decrypt_file();

//获取源文件、目的文件名
void get_file_name(char *dest_file_name, char *src_file_name);

//读取源文件内容
char *read_src_file(unsigned long int *file_length, char *src_file_name);

//源文件加密
char *file_text_encrypt(char *src_file_text, unsigned long int length, unsigned int password);

//源文件解密
char *file_text_decrypt(char *src_file_text, unsigned long int length, unsigned int password);

//保存目的文件
void save_file(char *text, unsigned long int length, char *file_name);


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

		int ch = 0;
		scanf("%d", &ch);

		if (ch == 1)
		{
			encrypted_file();
		}
		else if (ch == 2)
		{
			decrypt_file();
		}
		else if (ch == 3)
		{
			break;
		}
	}

	return 0;
}

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

void encrypted_file()
{
	//获取源文件、目的文件名
	char dest_file[32] = "";
	char src_file[32] = "";
	get_file_name(dest_file, src_file);

	//读取源文件内容
	unsigned long int file_length = 0;
	char *data = read_src_file(&file_length, src_file);

	//源文件加密
	unsigned int password = 0;
	printf("please input your unsigned int passworld:");	
	scanf("%u", &password);
	data = file_text_encrypt(data, file_length, password);

	//保存目的文件
	save_file(data, file_length, dest_file);
}

void decrypt_file()
{
	//获取源文件、目的文件名
	char dest_file[32] = "";
	char src_file[32] = "";
	get_file_name(dest_file, src_file);

	//读取源文件内容
	unsigned long int file_length = 0;
	char *data = read_src_file(&file_length, src_file);

	//源文件解密
	unsigned int password = 0;
	printf("please input your unsigned int passworld:");	
	scanf("%u", &password);
	data = file_text_decrypt(data, file_length, password);

	//保存目的文件
	save_file(data, file_length, dest_file);
}

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

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

	fseek(fp, 0, 2);

	*file_length = ftell(fp);
	rewind(fp);

	char *data = (char*)calloc(1, *file_length + 1);
	if (data == NULL)
	{
		perror("calloc");
		exit(-1);
	}

	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)
{
	for (int i=0; i<length; i++)
	{
		src_file_text[i] += password;
	}

	return src_file_text;
}

char *file_text_decrypt(char *src_file_text, unsigned long int length, unsigned int password)
{
	for (int 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 = fopen(file_name, "w");
	if (fp == NULL)
	{
		perror("fopen");
		exit(-1);
	}

	fwrite(text, length, 1, fp);
	fclose(fp);

	if (text != NULL)
	{
		free(text);
		text = NULL;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值