C语言程序开头文件加密,最简单的一小段文件加密程序(c语言)

“纸上得来终觉浅,绝知此事要躬行”

心血来潮,想写一段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(-),导致程序出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值