C 文件加密

注意写文件时应注意少和磁盘打交道

#include <stdio.h>
#include <Windows.h>

#pragma warning(disable:4996)


#define FILESIZE 100*1024*1024

// 函数功能:计算文本的大小
// 函数参数:文件指针
// 函数返回:文本大小
int GetFilesSize(FILE *fp)
{
	if (fp == NULL)
		return 0;
	int nFileLen,flen;
	flen = ftell(fp);
	fseek(fp,0,SEEK_SET);
	fseek(fp,0,SEEK_END);
	nFileLen = ftell(fp);
	fseek(fp,flen,SEEK_SET);
	return nFileLen;
}

// 函数功能:加密文件
// 函数参数:文本名称地址
// 函数返回:新文本
int myEncryptFile(char *filename)
{
    FILE	*fp;
    BYTE	*buf,*p,*q;
	int		nFileLen, i;
	
	// 剔除不可用的的指针
	if((fp = fopen(filename,"rb+")) == NULL)
	{
		printf("%s open file failed.\n", filename);
		return 0;
	}

	nFileLen = GetFilesSize(fp);
	if (nFileLen == 0 || nFileLen > FILESIZE)
	{
		fclose(fp);
		return 0;
	}

	buf = (BYTE*)malloc(nFileLen + 0x1000);
	memset(buf, 0, nFileLen + 0x1000);

	// 开辟空间
    fseek(fp, 0, SEEK_SET);
	fread(buf, 1, nFileLen, fp);	
  
	// 再将指针移到文件首段
	p = buf;
    q = buf;
    
	// 对文件每个字符进行加密处理
	for (i = 0; i < nFileLen; i++)
		*p++ ^= 0x55;

	// 写文件
	fseek(fp, 0, SEEK_SET);
	fwrite(q, 1, nFileLen,fp);

// 	while(p < buf + nFileLen)
// 	{
//          *p = *p^0x55;
// 		// fwrite(p,1,1,fp);
// 		 p++;
// 	}
//     // 对编译好文本的覆盖原文本
// 	while(q < buf + nFileLen)
// 	{
//        fwrite(q,1,1,fp);
// 	   q++;
// 	}

	free(buf);
	fclose(fp);

	return 1;
}

// 函数功能:帮助
void Help()
{
	printf("Encryptingfile V1.0 written by HeKai 2014.10.10.\n");
	printf("Encryptingfile [filepath]\n");
}

// 主函数
int main (int argc, char** argv)
{
	// 显示帮助
	Help();

	if (argc <= 1)
	{
		printf("Please input param.\n\n\n");
		return 0;
	}

	// 加密文件
	if(myEncryptFile(argv[1]) == 1)
	{
		printf("Encryp success !\n");
	}
	else
	{
		printf("Encryp failed.\n");
	}

	return 1;

}


posted @ 2014-10-10 09:49  赫凯  阅读(61)  评论(0)    收藏  举报