“纸上得来终觉浅,绝知此事要躬行”
心血来潮,想写一段C语言的程序,实现一个文件的加密,打算采用最简单的加密办法,就是逐个字节取反。
第一次花了一刻钟时间写了如下代码的程序:
/*
* File encrypter sample
*/
#include
int main(void)
{
FILE *fp;
FILE *temp;
char ch;
char ch2;
char strFileName[256] = {0};
char cmdBuf[256]={0};
printf("please input file name:");
gets(strFileName);
/* open two files */
fp = fopen(strFileName, "rb+");
if(fp == NULL)
{
printf("/n file: %s open err!/n", strFileName);
return -1;
}
temp = fopen("temp.cry", "wb+");
if(temp == NULL)
{
printf("/n file create err!/n");
return -1;
}
/* Encrypter every character, and write it to file */
do
{
ch = fgetc(fp);
ch2 = ~ch;
fputc(ch2, temp);
}while(ch != EOF);
fclose(fp);
fclose(temp);
/* Del old file */
sprintf(cmdBuf, "del %s", strFileName);
system(cmdBuf);
/* rename new file */
sprintf(cmdBuf, "ren temp.cry %s", strFileName);
system(cmdBuf);
return 0;
}
这里对这个程序说明下,里面最后几行,调用命令行的删除原来的文件,并将加密后的文件名改为原文件名。
编译OK后,测试了一下。
我自己制作了一个简单的二进制文件,16进制内容为:ff 00 11 22 33 00 ff,
加密后,发现文件的16进制为:00
回头看了看代码,确实有问题,因为fgetc函数,出错或者读到文件末尾,会返回值-1,即EOF,0xFFFF,但是程序中,也有可能真的存在0xff的值。
所以修改了代码如下:
/*
* File encrypter sample
*/
#include
int main(void)
{
FILE *fp;
FILE *temp;
char ch;
int ret = 0;
char strFileName[256] = {0};
char cmdBuf[256]={0};
printf("please input file name:");
gets(strFileName);
/* open two files */
fp = fopen(strFileName, "rb+");
if(fp == NULL)
{
printf("/n file: %s open err!/n", strFileName);
return -1;
}
temp = fopen("temp.cry", "wb+");
if(temp == NULL)
{
printf("/n file create err!/n");
return -1;
}
/* Encrypter every character, and write it to file */
while(!feof(fp))
{
ret = fgetc(fp);
if(ret != EOF)
{
ch = (char)ret;
ch = ~ch;
fputc(ch, temp);
}
}
fclose(fp);
fclose(temp);
/* Del old file */
sprintf(cmdBuf, "del %s", strFileName);
system(cmdBuf);
/* rename new file */
sprintf(cmdBuf, "ren temp.cry %s", strFileName);
system(cmdBuf);
return 0;
}
这样测试后是ok的。
fgetc函数返回的值是int类型,如果强制的赋值给char类型,会导致当读出的数据为0xff时,误认为是EOF(-),导致程序出错。