//简单文件加解密系统
#include <stdio.h>
#include <stdlib.h>
// 加密
void encryption(char buffer[],int fsize,int key);
// 解密
void decryption(char buffer[],int fsize,int key);
int main()
{
char src_filename[255] = "\0"; /*文件名数组(只能保存连路径在内255个字母的文件名)*/
char dst_filename[255] = "\0";
char *buffer = NULL;
long fsize = 0; /*记录文件的长度*/
int key = 0;
int operate_flag = 0;
FILE *file_src = NULL; /*源文件指针*/
FILE *file_dst = NULL; /*目标文件指针*/
printf(" =========A SIMPLE ENCRYPTION / DECRYPTION SYSTEM=========\n");
//Step1 屏幕输出与参数处理
//Step1.1 获取输入文件名
printf("Please input the path and filename of the file you want to process:\n");
// 将在输入的源文件名保存在src_filename数组中
scanf("%s",src_filename);
//Step1.2 获取Key
printf("Please input the key:\n");
scanf("%d",&key); /*用户输入密钥*/
//Step1.3 获取输出文件名
printf("Please input the path and filename of the file you have processed:\n");
// 将在输出的源文件名保存在dst_filename数组中
scanf("%s",dst_filename);
//Step1.4 获取操作模式(ENCRYPTION/DECRYPTION)
printf("Please input the operation: ENCRYPTION press '0'; DECRYPTION press '1'\n");
scanf("%d",&operate_flag);
//Step2 文件读取
//Step2.1 使用fopen,打开src_filename
// 以只读、二进制读取方式打开文件
file_src = fopen(src_filename,"rb");
if(NULL == src_filename)
{
printf("ERROR!");
}
// 将文件读取游标放置到文件结束位置(SEEK_END即是文件末尾)
fseek(file_src,0,SEEK_END);
// 取得文件所在位置的偏移量(即是文件大小,取得该信息,目的是为明确需要申请多大的内存用于完整的读取文件)
fsize = ftell(file_src);
// 将文件读取游标放置到文件开始位置(准备从头开始读文件)
fseek(file_src,0,SEEK_SET);
// 根据文件大小,动态为buffer指针申请内存空间
buffer = (char *)malloc(fsize);
memset(buffer, 0x00, fsize);
// 将文件读入内存
fread(buffer,1,fsize,file_src);
// 关闭文件
fclose(file_src);
//Step3 文件加密/解密操作
if(0 == operate_flag)
encryption(buffer,fsize,key);
else
decryption(buffer,fsize,key);
//Step4 文件写入
// 以二进制写入方式打开文件
file_dst = fopen(dst_filename,"wb");
if(NULL == file_dst)
{
printf("ERROR!");
}
// 将文件流写入文件
fwrite(buffer,1,fsize,file_dst);
printf("OK\n");
// 关闭文件
fclose(file_dst);
free(buffer);
return 0;
}
// 加密操作,加密方式为将每个2进制方式读取的字符的ascii码值 + 密钥
// 例如:源文件内容:ABCD
// 密钥:1
// 加密后内容:BCDE
void encryption(char * buffer,int fsize,int key)
{
int i;
for(i = 0; i < fsize; i++)
{
buffer[i] = buffer[i] + key;
}
}
// 解密操作,解密方式为将每个2进制方式读取的字符的ascii码值 - 密钥
// 例如:源文件内容:BCDE
// 密钥:1
// 解密后内容:ABCD
void decryption(char * buffer,int fsize,int key)
{
int i;
for(i = 0; i < fsize; i++)
{
buffer[i] = buffer[i] - key;
}
}