c语言文本文件加密

[复制链接]
查看11 | 回复3 | 2011-1-6 10:26:43 | 显示全部楼层 |阅读模式
Tittle: 文本文件加密解密问题
为了不让别人看到文本文件内写的东西,我写了个程序用以加密。程序思路如下:
1.将需要加密的txt文件按规则命名,存在C盘根目录下
2.依次输入10个加密扰码,并把密码输出到C盘根目录下
3.文本文件的字符一对一的和加密扰码进行运算,算得加密后数据,输出到C盘根目录下
需要看文件内容时,只需要同时有加密后文件和扰码文件就可以进行解密。
但是解密时出现了问题,每次都只能解一部分,不能解全部。根据我输入的10个扰码不同,能解的数量也不同。
下面是我编写的源代码:
#include
#include
#include
using namespace std;
int _CLEANING;
#define ENTER cout<<"请按回车键继续..."<<endl;
#define CPause ENTER; while((_CLEANING=getchar())!='\n'&&_CLEANING!=EOF);clearerr(stdin); getchar();
#define C_ENTER while((_CLEANING=getchar())!='\n'&&_CLEANING!=EOF);clearerr(stdin);
#define Pause ENTER; getchar();
void PLUSSEC()
{
FILE *rfp;
FILE *wfp;
FILE *wsc;
int rf[10];
int wf[10];
int sec[10];
cout<<"请将需要加密的文件命名为 unpassed.txt 保存在C盘根目录下\n\n准备完毕后";
Pause;
cout<<"请输入10个加密扰码:\n"<<endl;
int temp;
for(temp=0;temp<10;temp++)
{
printf("请输入第%d个加密扰码:",temp+1);
scanf("%d",&sec[temp]);
}
cout<<"\n--------------------------------\n"<<endl;
if((rfp=fopen("C:\\unpassed.txt","r"))==NULL)
{
cout<<"C盘根目录下未发现 unpassed.txt 文件,程序将退出。\n\n"<<endl;
exit(0);
CPause;
}
wfp=fopen("C:\\Passedfile","w");
wsc=fopen("C:\\Password","w");
for(temp=0;temp<10;temp++)
fprintf(wsc,"%d,",sec[temp]);
fclose(wsc);
int flag=1;
do{
for(temp=0;temp<10;temp++) rf[temp]=fgetc(rfp);
for(temp=0;temp<10;temp++)
{
if(rf[temp]==EOF) {flag=0;break;}
wf[temp]=rf[temp]+sec[temp];
}
for(temp=0;temp<10;temp++)
{
if(rf[temp]==EOF) {flag=0;break;}
fputc(wf[temp],wfp);
}
}while(flag);
fclose(rfp);
fclose(wfp);
cout<<"加密成功!\n加密后文件为: C:\\Passedfile ,加密密钥为: C:\\Password\n请注意保存以上两文件!\n\n"<<endl;
C_ENTER;
}
void main()
{
cout<<"请选择功能:\n1.加密程序\n2.解密程序"<<endl;
char choose;
choose=getchar();
C_ENTER;
if(choose=='1') {CLS;PLUSSEC();}
if(choose=='2') {CLS;PASSSEC();}
cout<<"程序结束,";
Pause;
}
我就是对我的源代码进行加密的。如果加密扰码都是正负10以内的,程序没有异常。如果数字比较大,20多,30多的话,就解不出来了。不知高手是否可以赐教,这是为什么呢?揭秘部分应该怎样改,才能使用20,30,50左右这样的数字来做扰码呢?
解密部分代码:(请和上面代码结合看。百度限制发的字数)
void PASSSEC()
{
FILE *rfp;
FILE *wfp;
FILE *rsc;
int rf;
int wf;
int sec[10];
cout<<"请将加密文件 Passedfile 和解密参数文件 Password 拷贝到C盘根目录下。\n准备好后";
Pause;
if((rfp=fopen("C:\\Passedfile","r"))==NULL)
{
cout<<"C盘根目录下未发现加密文件:Passedfile,程序将退出。\n\n"<<endl;
exit(0);
Pause;
}
if((rsc=fopen("C:\\Password","r"))==NULL)
{
cout<<"C盘根目录下未发现解密参数文件:Password,程序将退出。\n\n"<<endl;
exit(0);
Pause;
}
wfp=fopen("C:\\CleanSEC.txt","w");
int temp;
for(temp=0;temp<10;temp++)
fscanf(rsc,"%d,",&sec[temp]);
fclose(rsc);
int flag=1;
do{
if(temp==10) temp=0;
rf=fgetc(rfp);
wf=rf-sec[temp];
if(!feof(rfp)) flag=1;
else flag=0;
if(flag==1) fprintf(wfp,"%c",wf);
temp++;
}while(flag);
cout<<"文件已完成解密!已解密文件在 C:\\CleanSEC.txt 。请打开查看。\n";
fclose(rfp);
fclose(wfp);
}

回复

使用道具 举报

千问 | 2011-1-6 10:26:43 | 显示全部楼层
你所使用的文件处理函数,均为fputc,fgetc,fscanf等字符处理函数加密前,文本内容确实是字符串,但是加密后,就会存在非字符型数据,这时候fputc,fgetc,fscanf等函数就不能进行正常处理了。简单的例子,\0,\13这些数据会被字符处理函数截断所以请使用fread,fwrite等函数,这样就不会局限于字符串了 比如fscanf(rsc,"%d,",&sec[temp]);,你可以写成fread((void *)&sec[temp],sizeof(int),1,rsc);
回复

使用道具 举报

千问 | 2011-1-6 10:26:43 | 显示全部楼层
问题在这里注意加密后的溢出问题 char型字符最大能表示的数字是127unsigned char则是255所以用加法加密要注意处理溢出问题不能简单的加加减减
回复

使用道具 举报

千问 | 2011-1-6 10:26:43 | 显示全部楼层
何必这么费劲,有专门对文件和文件夹加密加锁的工具.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行