一、原理分析
对称加密体制是传统而经典的加密体制策略
加密方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;
}