C语言异或加解密文件函数

#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];
}


暂无留言,赶快评论吧

欢迎留言