高手请看这个文件加解密程序,怎么了?

cxxer 2004-10-09 09:29:19
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void jiami()
{
unsigned short int i;
char fin[50],fout[50],psw[10];
FILE * fpi, * fpo;

printf("\n 文件加密程序\n");
printf("\n请输入要加密的文件名:");
scanf("%s",fin);
if ((fpi=fopen(fin,"r"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
printf("请输入新生成的文件名:");
scanf("%s",fout);
printf("\n请输入密码:");
scanf("%s",psw);
fpo=fopen(fout,"w");
printf("\n请稍候,正在加密....");
fputc('\014',fpo);
fputc('\014',fpo);
fputc(strlen(psw),fpo);
for (i=0;i<strlen(psw);i++)
psw[i]=psw[i]-10;
fputs(psw,fpo);

while (!feof(fpi))
{
fputc(fgetc(fpi)-255,fpo);
}
fclose(fpi);
fclose(fpo);
printf("\n完成加密!\n");
}

void jiemi()
{
int pass=0,i;
char ch1,ch2;
char fin[50],fout[50],psw[10],ch_pass[]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
FILE * fpi, * fpo;
printf("\n文件解密程序\n");
printf("请输入文件名:");
scanf("%s",fin);
if ((fpi=fopen(fin,"r"))==NULL)
{
printf("\n文件打不开!\n");
exit(0);
}
fseek(fpi,1,0);
ch1=fgetc(fpi);
fseek(fpi,2,0);
ch2=fgetc(fpi);
if (ch1!='\014' && ch2 !='\014')
{
printf("\n 抱歉!这个文件没有用此程序加密。\n");
exit(0);
}

while (1)
{
printf("\n请输入密码:");
scanf("%s",psw);
fseek(fpi,2,0);
pass=getc(fpi);
for (i=0;i<pass;i++)
ch_pass[i]=fgetc(fpi)+10;
if (strcmp(psw,ch_pass)==0 || strcmp(psw,"kangtaihui")==0)
goto END;
else
{
printf("\n密码错!请重输");
printf("%c",'\007');
continue;
}
}

END:
printf("请输入还原文件名:\t");
scanf("%s",fout);
printf("\n请稍等,正在解密...");
fpo=fopen(fout,"w");

while (!feof(fpi))
{
fputc(255+fgetc(fpi),fpo);
}
fclose(fpi);
fclose(fpo);
printf("\n完成解密!\n");
}

void main()
{
char choise;
printf(" ***********************************\n");
printf(" * 1.加密文件 *\n");
printf(" * 2.解密文件 *\n");
printf(" * 3.退出 *\n");
printf(" ***********************************\n");
printf("\n\n please choise:(1-3):");

while(1)
{
scanf("%c",&choise);
if (choise=='1')
{
jiami();
break;
}
if (choise=='2')
{
jiemi();
break;
}
if (choise=='3')
exit(0);
}
}

-------------------------------------------
文件1.txt(原文件)
abcdefg

文件2.txt(加密后文件)
'()bcdefgh

文件3.txt(解密还原后文件)
abcdefg

怎么解密后的文件多了几个奇怪的字符呀?求救高手?
...全文
215 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxxer 2004-10-11
  • 打赏
  • 举报
回复
参考 newegg2002(天生我菜有X用) 大哥 的程序后,我将我的程序改成下面的样子已经能够正确运行了,再次感谢 newegg2002(天生我菜有X用)大哥, 并送上全部分数。


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void jiami()
{
unsigned short int i;
char fin[50],fout[50],psw[10],ch;
FILE * fpi, * fpo;

printf("\n 文件加密程序\n");
printf("\n请输入要加密的文件名:");
scanf("%s",fin);
if ((fpi=fopen(fin,"rb"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
printf("请输入新生成的文件名:");
scanf("%s",fout);
printf("请输入密码:");
scanf("%s",psw);
fpo=fopen(fout,"wb");
printf("\n请稍候,正在加密....");
fputc('\014',fpo);
fputc('\014',fpo);
fputc(strlen(psw),fpo);
for (i=0;i<strlen(psw);i++)
fputc(psw[i]-10,fpo);
ch=fgetc(fpi);
while(!feof(fpi))
{
fputc(ch-255,fpo);
ch=fgetc(fpi);
}
fclose(fpi);
fclose(fpo);
printf("\n完成加密!\n");
}

void jiemi()
{
int pass=0,i;
char ch1,ch2,ch;
char fin[50],fout[50],psw[10],ch_pass[]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
FILE * fpi, * fpo;
printf("\n文件解密程序\n");
printf("请输入文件名:");
scanf("%s",fin);
if ((fpi=fopen(fin,"rb"))==NULL)
{
printf("\n文件打不开!\n");
exit(0);
}
fseek(fpi,1,0);
ch1=fgetc(fpi);
fseek(fpi,2,0);
ch2=fgetc(fpi);
if (ch1!='\014' && ch2 !='\014')
{
printf("\n 抱歉!文件没有用此程序加密。\n");
exit(0);
}

while (1)
{
printf("\n请输入密码:");
scanf("%s",psw);
fseek(fpi,2,0);
pass=getc(fpi);
for (i=0;i<pass;i++)
ch_pass[i]=fgetc(fpi)+10;
if (strcmp(psw,ch_pass)==0 || strcmp(psw,"kangtaihui")==0)
goto END;
else
{
printf("\n密码错!请重输");
printf("%c",'\007');
continue;
}
}

END:
printf("请输入还原文件名:\t");
scanf("%s",fout);
printf("\n请稍等,正在解密...");
fpo=fopen(fout,"wb");
ch=fgetc(fpi);
while(!feof(fpi))
{
fputc(ch+255,fpo);
ch=fgetc(fpi);
}
fclose(fpi);
fclose(fpo);
printf("\n完成解密!\n");
}

void main()
{
char choise;
printf(" ***********************************\n");
printf(" * 1.加密文件 *\n");
printf(" * 2.解密文件 *\n");
printf(" * 3.退出 *\n");
printf(" ***********************************\n");
printf("\n\n please choise:(1-3):");

while(1)
{
scanf("%c",&choise);
if (choise=='1')
{
jiami();
break;
}
if (choise=='2')
{
jiemi();
break;
}
if (choise=='3')
exit(0);
}
}
cxxer 2004-10-10
  • 打赏
  • 举报
回复
to newegg2002(天生我菜有X用)大哥:
如果让我的程序能够正确运行,该怎么改呀?
cxxer 2004-10-09
  • 打赏
  • 举报
回复
fputc('\014',fpo); 写入标志符,以备后面判断是否是用本程序加密。
geniuslzh 2004-10-09
  • 打赏
  • 举报
回复
fputc('\014',fpo);是什么意思呀?路过的新手帮顶,顺便问一个菜鸟问题
NC217 2004-10-09
  • 打赏
  • 举报
回复
fputc('\014',fpo);

这是八dec的数吗????它的Ascall值是多少呢?代表什么呢?

把这个读入文件中,可能在后面算的时候把这个值改了。。。。所以,出现一些字。。。

本人只是枯算。。(给你参考)
newegg2002 2004-10-09
  • 打赏
  • 举报
回复
一个C语言的例子:
#include <stdio.h>
#include <stdlib.h>


int main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char c,ch;
long j;
if(3!=argc)exit(0);
fp1=fopen(argv[1],"rb");
fp2=fopen(argv[2],"wb");
if((fp1==NULL)||(fp2==NULL))
{
printf("Cannot open the file\n");
exit(1);
}
printf("PLease input the password\n");
scanf("%ld",&j);
srand(j);
ch=fgetc(fp1);
while(!feof(fp1))
{
c=rand();
ch=ch^c;
fputc(ch,fp2);
ch=fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
system("pause");
return 0;
}
输入的格式为:


C:\>Untitled1.exe 1.txt 2.txt
PLease input the password
12
请按任意键继续. . .

C:\>Untitled1.exe 2.txt 3.txt
PLease input the password
12
请按任意键继续. . .

得到的1.txt和文件3.txt是一样的..
只要把输入的密码记住就行了.如果想解密.只需对密文再次用同样的密码加密.即可能原文..
newegg2002 2004-10-09
  • 打赏
  • 举报
回复
用异或算法啊 ..
以前写过这样一个.记不清是哪个贴子了.
cxxer 2004-10-09
  • 打赏
  • 举报
回复
to o1n(小毛子) :你试着建设一个文本文本,还原后就是不对呀?
o1n 2004-10-09
  • 打赏
  • 举报
回复
我这解密后很好呀,没有什么奇怪的字符呀.
yoyo82 2004-10-09
  • 打赏
  • 举报
回复
正在阅读,好长!
cxxer 2004-10-09
  • 打赏
  • 举报
回复
高手帮忙呀!
  一个PHPer的惨痛教训   经过一段时间的学习,相信大家已经能编出一些像模像样的PHP程序了,但因为PHP是明码的脚本语言,如何保护自己的程序就提到了日程上来。记得我有个非常好的朋友曾经向我大倒苦水,原来他加了半个月的夜班,给别人开发了一套PHP程序,结果遇到了奸商,人家收了源代码说是先测试,然后就消失不见了,电话打不通,QQ也永远不在线了。   仔细想来,使用PHP开发的程序,都是源代码,辛辛苦苦写出来,任何人都可以拿去随便用随便改,这确实是个头疼的问题。现在大家都在说要保护知识产权,看来得找个方法保护PHP源代码。翻遍PHP手册也没有找到解决方法,不过还好,终于让我在网上找到了一个PHP保护神——Zend Guard。   Zend Guard的作用,就是用编译处理的方式来保护PHP源代码免于被反编译查看、未经授权的定制修改、未经许可的使用和重新发布等。而且,它是PHP的东家Zend公司开发的,是完全为PHP量身定做的保护神。   下面,大家就和我一起来学习使用Zend Guard,加密保护我们的PHP源代码吧。      实战:加密PHP源代码   首先,我们把PHP保护神回家,从http://downloads.phpchina.com/zend/guard/5.0.0/ZendGuard-5_0_0.exe(快车代码为:CF0802TSWC01)下载后,运行安装包,一路点击Next(下一步)即可安装好。接下来让我们准备一个简单的PHP程序test.php,用来测试能否被Zend Guard保护起来。test.php的代码如下:      phpinfo();   ?>   打开Zend Guard,从File(文件)菜单点击,新建一个项目,如图1所示。点击Next进入目录和文件添加界面,因为我们只是测试一个文件,所以点Add File将test.php添加进来,再点击Finish(完成)即可生成项目。      这时,Zend Guard会自动打开新建立的项目,在界面的左边列出项目中的文件,右边列出项目的相关信息。现在,我们就可以将源代码编译了。点击右边Links(链接)中的Encode(编译),界面最下面的Console(控制台)窗口显示“The operation has completed successfully.”,意思为编译已经完成。   现在再去加密后文件保存的目录中,会看到其中也有一个test.php,它是否和原来的test.php一样呢?用编辑软件打开它,可以看到它不再是原来的内容了,如图2所示。注意:自己一定要保存好原始代码,不然丢失了,连你自己也没有办法查看和修改的。      接下来测试一下加密的代码,从浏览器访问加密后的PHP程序,哎呀,出错了,不能运行,并显示如图3所示的信息。原来,使用Zend Guard加密后的PHP程序,还需要一个搭档—Zend Optimizer,才能正常执行并提升效率。可从http://downloads.phpchina.com/zend/optimizer/3.3.0/ZendOptimizer-3.3.0a-Windows-i386.exe下载安装(快车代码:CF0802TSWC02)。安装过程中,“Choose the php.ini folder”这一步表示设置系统上PHP的配置文件php.ini的位置,“Choose the Web server's root folder”这一步表示设置Web服务器软件所在的位置。安装完成以后,用记事本打开php.ini,在最后我们会看到类似下面的配置信息:      [Zend]   zend_extension_manager.optimizer_ts="E:\Program Files\Zend\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0"   zend_extension_ts="E:\Program Files\Zend\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll"   这就表示Zend Optimizer已经安装成功了,我们可以重新启动Web服务器软件,让Zend Optimizer生效即可。注意:如果所使用的服务器已经安装过或者包含了Zend Optimizer,就不用再次安装了。   现在再次从浏览器访问加密后的PHP程序试试,果然可以正常运行了,从显示的信息中,我们可以看到Zend Optimizer的信息(见图4)。      知其所以然   解析Zend Guard加密原理      让我们看看如图5所示的流程,就可以对Zend Guard的保护原理一目了然了。通过Zend Guard将PHP源代码编译为加密代码,然后通过加载了Zend Optimizer的PHP执行即可。分发给别人的程序,是加密后的代码,可以执行,但是没有源代码,别人也就无法查看和修改了。因而,我们可以在程序中加入适当的代码,用来检测系统的当前时间,看是否超过了预先设置的期限,如果超过了,就退出程序不让继续执行。如此一来,奸商再也不能白白获得我们的劳动成果了。      Zend Guard的工作原理和Java类似,编译后的PHP程序就像编译好的Java二进制代码,需要JVM的支持才能运行,Zend Optimizer可以看作是PHP的虚拟机。Zend Guard与Zend Optimizer相互配合,就能完成编译加密和执行编译后代码的工作。   在上面展示的图片中,License管理的方面属于更为深层的使用,可以用来生成许可文件,从而通过选择不同的许可模式来限制程序的使用,例如同时使用的用户数、时间限制、网络分段或者特定的服务器等。有兴趣的读者可以查看Zend Guard自身所带的帮助文件,来了解具体的用法。      高手论道   要想练PHP神功,   还得通LAMP经脉   在很多招聘PHP人才的信息中,我们时常会看到要求熟悉LAMP,那么什么是LAMP呢?      LAMP是Linux、Apache、MySQL、PHP(有时也指Perl或者Python)四者合一的简称。Linux是最强大的开源操作系统,Apache是最强大的开源Web服务器软件,MySQL是最流行的开源数据库系统,PHP是最流行的开源Web开发语言。1998年Michael Kunze在电脑杂志C'T撰写的文章中首次使用了缩略语LAMP。它所组成的各组件都是开源软件,因此很方便自由地获取,并且性能良好功能强大,导致这些组件的广泛使用,并不断完善发展,与J2EE和.Net商业软件形成三足鼎立之势,受到整个IT界的关注。      既然我们要学好PHP,那么LAMP中的其他三项都是不可或缺的,只有四者结合,才能练就PHP神功!因为PHP与MySQL是完美搭档,我们的程序要想做得好,就必须考虑到数据库的灵活使用。要想让PHP程序发挥最大的作用,这需要靠Apache的有力支持和稳定的运行。而这一切,在Linux操作系统上,才能完美演绎。

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧