一、原理分析
对称加密体制是传统而经典的加密体制策略
加密方A使用该密钥key对要保密的文件进行加密操作,从而生成密文
解密方B同样使用该密钥key对加密文件实施解密操作,从而生成明文
(一)加密过程
(二)解密过程
- 只有输入正确的密码才能解密加密文件,不然得到的文件不是原来的
二、项目提示
1、打开文件的时候用二进制方式打开进行读写
2、测文件大小方法
-
用fseek() 定位流指针到文件的末尾
-
用ftell()函数测流指针的位置,即文件的大小
3、读文件内容
-
根据文件的大小用malloc申请内存空间保存读出的内容
-
读文件数据的时候要从文件的开始读(rewind())
三、程序编写
(一)框架的搭建
-
根据项目提示与要求搭建基本的输入输出框架
(二)fun.h
// 防止头文件重复包含
#pragma once
#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* 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);
#endif
(三)fun.c
-
包含头文件
#include<stdio.h>
#include<stdlib.h>
1、从键盘获取原文件和目的文件名字
-
void get_file_name(char * dest_file_name,char * src_file_name)
-
函数功能:获取目的文件和原文件的名字
-
参数
src_file_name:原文件名字字符数组首地址
dest_file_name:目的文件的名字字符数组首地址
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;
}
2、从文件中读出内容
-
char * read_src_file(unsigned long int *file_length,char *src_file_name)
-
函数功能:在此函数中测文件的大小,并通过calloc函数开辟空间。再把文件内容读出,并返回读出字符数组的首地址
-
参数
file_length:整型指针,此地址中保存文件字节数
src_file_name:文件名字,从此文件中读取内容
返回值:读出字符串的首地址
char* read_src_file(unsigned long* file_length, char* src_file_name)
{
// 1、创建文件指针
char* data = NULL;
FILE* fp = NULL;
fp = fopen(src_file_name, "r");
if (fp == NULL)
{
perror("fopen");
return NULL;
}
// 2、获取文件总长度
fseek(fp, 0, 2); // 将文件流指针定位到文件尾部
*file_length = ftell(fp); // 获取文件长度
rewind(fp); // 复位文件流指针
// 3、根据文件的长度申请堆区空间
data = (char*)calloc(1, *file_length);
if (data == NULL)
{
perror("calloc");
return NULL;
}
// 4、一次性读取文件内容
fread(data, *file_length, 1, fp);
fclose(fp);
// 5、将空间首地址返回
return data;
}
3、字符数组加密
-
char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)
-
加密原理:字符数组中每个元素加上password
-
函数功能:对字符串进行加密
-
参数
src_file_text:要加密的字符串
length:字符串的长度
password:加密密码
返回值:加密后的字符串的首地址
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;
}
4、解密字符串
-
char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned
int password) -
思想:把数组中的每个元素减去password给自己赋值
-
函数功能:解密字符
-
参数
- src_file_text:要解密的字符串
- length:字符串的长度
- password:解密密码
- 返回值:解密后的字符串的首地址
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;
}
5、保存文件
-
void save_file(char* text,unsigned long int length,char * file_name)
-
思想:传入字符数组的首地址和数组的大小及保存后的文件的名字,即可保存数组到文件中
-
函数功能:将字符串保存到目的文件中
-
参数:
text:要保存的字符串首地址
file_name:目的文件的名字
length:字符串的长度
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("保存成功!\n");
return;
}
6、打印文件信息
-
函数功能:打印帮助信息
void print_help()
{
printf("********1:加密文件***********\n");
printf("********2:解密文件***********\n");
printf("********3:退出程序***********\n");
}
(四)main.c
#include<stdio.h>
#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[31] = ""; // 给一个字节空间给'\0'
char dst_file[31] = "";
char* file_data = NULL;
unsigned long file_length = 0;
unsigned int passwd = 0;
// 1、获取源文件 目的文件名
get_file_name(dst_file, src_file);
// 2、获取源文件名对应的文件
file_data = read_src_file(&file_length, src_file);
// 3、获取用户输入的密码
printf("请输入你的密码:");
scanf("%u", &passwd);
// 4、对文件内容加密
file_data = file_text_encrypt(file_data, file_length, passwd);
// 5、对加密好的文件内容保存到目的文件名中
save_file(file_data, file_length, dst_file);
}
else if (cmd == 2)
{
char src_file[31] = "";
char dst_file[31] = "";
char* file_data = NULL;
unsigned long file_length = 0;
unsigned int passwd = 0;
// 1、获取源文件目的文件名
get_file_name(dst_file, src_file);
// 2、获取源文件名对应的文件内容
file_data = read_src_file(&file_length, src_file);
// 3、获取用户输入的密码
printf("请输入你的密码:");
scanf("%u", &passwd);
// 4、对文件内容解密
file_data = file_text_decrypt(file_data, file_length, passwd);
// 5、对解密好的文件内容保存到目的文件名中
save_file(file_data, file_length, dst_file);
}
else if (cmd == 3)
{
break;
}
else
{
printf("请输入一个正确的选项\n");
}
}
return 0;
}