#include<stdio.h>
#include <sys/stat.h>
#include<stdbool.h>
char *Key="qwert789456-+";
short EncodeFile(const char * File_0,const char *File_E/*,char (*p) (void)*/) {
FILE *f1=fopen(File_0,"r+b"); //读方式打开一个二进制文件,只允许读数据
FILE *f2=fopen(File_E,"w+b") ;//写方式打开一个二进制文件,只允许写数据
unsigned long StrLong=GetrFileSizeK(File_0);
if(StrLong==0) {
fwrite("", sizeof(char), StrLong, f2);
fclose(f1);
fclose(f2);
return 1;//长度为0
}
if(StrLong>512*1024*1024) {
fclose(f1);
fclose(f2);
return 2;//文件大小太大
}
if(!StrLong||!f1||!f2) {
return -1;//无法打开
}
char *pDATA = (char *)malloc(StrLong*sizeof(char));
if(pDATA==NULL) {
return -2;//内存申请失败
}
fread(pDATA, sizeof(char), StrLong, f1);
for (unsigned long i = 0; i < StrLong; i++) {
pDATA[i]^=(GetRanDomKey());
}
fwrite(pDATA, sizeof(char), StrLong, f2);
fputc(10^(int)GetRanDomKey(),f2);
free(pDATA);
fclose(f1);
fclose(f2);
return 0;
}
short DecodeFile(const char * File_0,const char *File_E/*,char (*p) (void)*/) {
FILE *f1=fopen(File_0,"r+b"); //读方式打开一个二进制文件,只允许读数据
FILE *f2=fopen(File_E,"w+b") ;//写方式打开一个二进制文件,只允许写数据
unsigned long StrLong=GetrFileSizeK(File_0);
if(!StrLong||!f1||!f2) {
remove(File_E);
return -1;//无法打开文件
}
if(StrLong==0) {
return 1;//文件长度为0
}
if(StrLong>512*1024*1024) {
fclose(f1);
fclose(f2);
remove(File_E);
return -3;//文件太大
}
char *pDATA = (char *)malloc(StrLong*sizeof(char));
if(pDATA==NULL) {
fclose(f1);
fclose(f2);
remove(File_E);
return -2;//内存申请失败
}
fread(pDATA, sizeof(char), StrLong, f1);
unsigned long i;
for (i = 0; i < StrLong; i++) {
pDATA[i]^=(GetRanDomKey());
}
short code;
if((int)(pDATA[i-1])==10) {
fwrite(pDATA, sizeof(char), StrLong-1, f2);
code=0;//解密成功
} else {
remove(File_E);
code=-4;//解密失败
}
free(pDATA);
fclose(f1);
fclose(f2);
return code;
}
unsigned long GetrFileSizeK(const char *path) {
//获取文件名为path的文件大小。
struct stat statbuf;
stat(path,&statbuf);
unsigned long size=statbuf.st_size;
return size;
}
char GetRanDomKey() {
static unsigned short con; //密钥长度不会很长
++con;
if(con==(strlen(Key)+1)) {
con=0;
}
return Key[con];
}
完整工程在github
https://github.com/znkzz/File-Encryption