第一范文网 - 专业文章范例文档资料分享平台

C语言课程设计(图形编程 全)(2)

来源:用户分享 时间:2022-05-06 本文由小小的萌 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

2. 设定线型函数

在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。

void far setlinestyle(intlinestyle,unsigned upattern,int thickness); 该函数用来设置线的有关信息,其中linestyle是线形状的规定,

见下表:

该程序给用户三次输入密码的机会,如果正确则显示OK!welcome,否则显示Sorry!You cannot log in。

DOS系统下的批处理程序的加密程序

磁盘操作系统DOS的批处理程序是由后缀.BAT为扩展名的文本文件,该文件包括若干条DOS内部命令、外部命令及用户应用程序组成。当磁盘操作系统的命令解释程序6f3aa0e19b89680203d825af在命令所指定的路径上找到欲执行的批处理文件后,逐条解释并执行相应的有关命令,完毕后返回到DOS命令处理程序状态。由于批处理程序是以文本文件的形式存储在磁盘中,并能通过有关命令或文本编辑程序进行查阅、修改,所以批处理程序是完全透明的无保密性及安全性可言。为此,人们采取各种各样的保密方法、手段对批处理文本文件进行处理,以防止批处理程序被篡改、暴鼹。如何才能得到一种更安全保密的批处理文件的保密方法?我们通过实践找到了解决批处理程序进行加密的一种较好方法。

用DEBUG或PCTOOLS工具软件对批处理程序进行分析,可以发现每一个命令均以ODH,OAH作为该命令的结束符,而整个批处理文件以ODH,OAH,IAH 作为该处理程序的结束符。ODH,OAH,IAH分别是ASCII码的回车符,换行符、文件结束符,并且磁盘操作系统命令处理程序6f3aa0e19b89680203d825af是以ODH 作为批处理命令的结束符,以IAH作为批处理程序的结束符。通过以上分析,可以在不破坏原批处理程序文本文件组织结构的前提下,对批处理文本进行预处理,使批处理程序的换行符OAH全部改为返回OOH,从而使经过预处理的批处理程序的所有内容每一行层层覆盖,起到为批处理文件加密的作用。用此方法对批处理文本文件处理后,用TYPE,EDLIN,WS,DEBUG,PE,SK等命令或工具软件都无法破译批处理程序,最多只能破译最后两行的叠加结果,而不能确切得出最后两行的内容。

以下给出对批处理文本程序进行预处理的加密程序。此程序不仅能解决批处理程序的安全保密,还能够运用于文本文件形式的其他程序的安全保密,譬如BASIC

解释程序、dBASE及MFFOXPLAS源程序。

#include

#include

#include

/* 开始修改为固定返回符00H */

main()

{

char errorkkj[35],filename[20],*ptr, *data_all;

static char readerror[]="读文件失败!";

FILE *stream;

int length;

printf("请输入需要加密的文本文件名:");

gets (filename);

stream=fopen(filename,"rd+"); /* 打开二进制文本文件*/

if (stream=NULL)

{

printf ("007");

printf ("007");

strcpy (errorkkj, readerror);

strcat (errorkkj, filename);

printf ("%s",errorkkj);

printf("\007");

}

else

{

fseek(stream,2,SEEK_END);

length=ftell(stream);

data_all=(char *)malloc((unsigned)length,sizeof(char));

if(!data_all);

{

printf("出现错误,请检查后再运行!");

exit(1);

}

rewind(stream);

while(!feof(stream)) /* 修改为返回符00H */

fscanf(stream," [\x00]",data_all);

while(ptr=strrchr(data_all,'\n')) strnset(ptr,'\x00',1);

}

rewind(stream);

fwrite(data_all,1,length,stream);

fclose(stream);

}

数据文件的加密算法——替代加密法

在c语言中对数据文件利用替代法进行加密。计算机软件编程者往往对加密技术

比较感兴趣,其原因可能是加密是一种算法,它和编程一样很具有吸引力。在许多场合下加密是一种必须做的工作。

常用的加密方法有三种:①替代加密法:是以另外一个字符替代原来的字符并保持数据次序不变。②换位加密法:根据某一规则打乱原来的数据顺序。③位操作加密法:按照某种算法改变数据在计算机内的表示方法。

替代加密法是最简单的加密法,它是把文件中所有的字母都用另外一个字母代替而进行加密的,如:将字符串中所有的字符值都增加2,即:“abcde”将被加密为“cdefg”这种算法只是简单地把原字符串的值偏移一个固定的量,很容易被人识别。这是因为它最多只有26种可能偏移的情况,用不了多长时间就可以尝试出来,改进的办法就是每个字符的偏移情况各不相同,而使用多种偏移量。另外一个原因是它保留了各个单词之间的空格,破译者很容易将一个个单词区分开,改进的办法就是对空格也进行加密。

综合上述我们可采用随机偏移的办法进行加密,即对26个大小写字母和一个空格这53个字符小集合中,给每个字符随便指定一加密字符,这样加密后的加密文件可能有271种情况,被破译的机会相对小的多了。如在下例中我们将字符集zmb的加密密钥指定为mm,这样一来凡是在文件中出现a的地方都将用Q来替代,出现b的地方都将用A来替代,依次类推。其中这个密钥变量mm的顺序可随机更改,但对加密的文件必须用相同的密钥才能解密。

使用方法有两种:

①password <文件名1><文件名2>:将文件1加密为文件2。

②password <文件名1><文件名2>:将文件1解密到文件2。

/*password.c*/

#include

#include

char mm[54]="QAZWSXEDCRFVTGBYHNUJMIKOLPqwertyuiop asdfghjklzxcvbnm";

char zmb[54]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO PQRSTUVWXYZ ";

/* mm 为加密字符串即密钥, zmb 为原字母对照表*/

main(int argc,char *argv[])

{ FILE *fp1,*fp2;

int ch,flag=0;

if((toupper(*argv[3])=='E')||(toupper(*argv[3])=='D'))

flag=1;

if((argc!=4)||(flag!=1))

{ printf("\007 Error: 参数错误!!\n");

printf(" 格式:JM1 input output E/D \n");

exit(0); }

if((fp1=fopen(argv[1],"r"))==0){

printf("\007 Error: 不能打开输入文件!\n");

exit(0); }

if((fp2=fopen(argv[2],"w"))==0){

printf("\007 Error: 不能创建输出文件!\n");

exit(0); }

do {

ch=getc(fp1);

if(ch==EOF)

break;

if(isalpha(ch)||ch==' ')

if(toupper(*argv[3])=='E') /* E: 加密D:解密*/

ch=mm[find(zmb,ch)];

else

ch=zmb[find(mm,ch)];

putc(ch,fp2);

} while(1);

fclose(fp1);

fclose(fp2);

}

find(char *s,int ch)

{ register int t;

for(t=0;t< 54;t++)

if(ch==s[t])

return t; }

该加密方法可以说是比较科学,但是所生成的文件还是不难破译的,这是因为并不是所有字符出现的频率是一样的,而是有的多有的少。根据字母的频度表,比较容易破译密码文件,而且加密文件越长就越容易破译。为解决这个问题我们可以用多个替代密钥进行加密,即待加密文件中的每个字符不是始终用另一个字母来代替,而是轮翻由多个其他字符代替。这里我们就不详细讲了。

成批文件的简易加密法

下面这个程序可以使用通配符“,”和“?”,一次加密多个文件,不管是数据文件还是其他文件(包括各种可执行文件)。

程序采用替换加密法,对文件中所有字母数字和空格进行替换;即把串s1中每个字符用串S2中相应的字符替换,达到加密目的,带参数E(encode)是加密过程,D(decode)是解密过程。

例如:敲入CODE A*.* E就把当前目录下所有以A开头的文件加密;再敲入CODE A*.* E便把所有A*.*文件恢复。

程序加密过程可反复运行多次,以达到多重替换的目的。解密时只需逆向运行相同的次数即可。

/*CODE.c*/

#include "dir.h"

#include "ctype.h"

#include "stdio.h"

void encode(char * );

void decode(char * );

int at(char,char * );

char s[64]="abcdefghijklmnopqrstuvwxyz123456789\ ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char t[64]= "qwertopasdfghjkizxcvbnm\

MIN2B3V4C5X6Z7L8K9J0HGFDSAPOIUYTREWQ"; void main(int argc,char *argv[ ])

{

struct ffblk ptr;

int done;

char pd;

pd=toupper(* argv[2]);

if ((argc!=3)|| (strlen(argv[2])>1)||(pd!='E'&&pd!='D')){ printf("usage error.\n");

exit ();

}

done=findfirst(argv[1],&ptr,0);

while(! done){

if(pd=='E'){

printf("Encoding file:%s\n",ptr.ff_name);

encode(ptr.ff_name);

}

else{

printf("Decoding file%s\n",ptr.ff_name);

decode(ptr.ff_name);

}

done=findnext(&ptr);

};

}

void encode(char *filename)

{

FILE *fp1, *fp2;

int ch;

if((fp1=fopen(filename,"rb"))==NULL){

printf("cannot open file:%s\n",filename);

exit();

}

if((fp2=fopen("is","wb"))==NULL){

printf("can not open file:is\n");

exit();

}

while((ch=getc(fp1))!=EOF){

if(isalnum(ch)||ch==" ")

ch=t[at(ch,s)];

putc(ch,fp2);

}

fclose(fp1);

fclose(fp2);

fp1=fopen("is", "rd");

fp2=fopen(filename,"wb");

while((ch=getc(fp1))!=EOF){

putc(ch,fp2);

}

fclose(fp1);

fclose(fp2);

}

void decode(char *filename)

{

int ch ;

FILE * fp1,* fp2;

if((fp1=fopen(filename,"rd"))==NULL){

printf("cannot open file:%s\n",filename);

exit();

}

if((fp2=fopen("is","wb"))==NULL){

printf("can not open file:is\n");

exit();

}

while((ch=getc(fp1))!=EOF){

if(isalnum(ch)||ch==" ")

ch=s[at(ch,t)];

putc(ch,fp2);

};

fclose(fp1);fclose(fp2);

fp1=fopen("is","rb");

fp1=fopen("filename,","wb");

while((ch=getc(fp1))!=EOF){

putc(ch,fp2);

}

fclose(fp1);

fclose(fp2);

}

int at(char ch,char *ss)

{

register int i;

for(i=0;i<64;i++)

if(ch==ss) return i;

}

限制软件的使用次数

限制软件使用的方法有很多,关键是把次数这个值储存在哪里,在这里我们介绍这么一种方法,通过改变文件的时间来存储试用次数,从而限制软件的试用。在MS-DOS中,文件的时间是通过一个16位的值来保存的,位15~11用来保存小时数,位10~5用来保存分钟数,位4~0用来保存秒钟数。这个16 位的值正

好可以被我们用来保存试用次数。例如,在下面的示例程序中,我们就使用了保存分钟数的位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分钟数加了1,一般人很难察觉,这种方法有比较好的隐蔽性。

下面我们简要介绍一下示例程序中所涉及的中断。

1.中断21H的功能3DH

用途:打开文件用于读、写或补充。

调用寄存器:AH=3DH,AL--00H,DS:DX=文件名;

返回寄存器:CF复位—成功,AX:文件把柄。

CF置位—出错,AX=错误代码。

2.中断21H的功能3EH

用途:强迫清除所有缓冲区,更新目录,使文件把柄无效。

调用寄存器:AH=3EH,BX二文件把柄;

返回寄存器:CF复位—成功,AX被破坏,

CF置位--出错,AX:错误代码。

3.中断21H的功能57H、子功能00H

用途:读出文件被最后修改的日期和时间。

调用寄存器:AX=5700H,BX=文件把柄;

返回寄存器:CF复位一成功,CX=文件时间

CF置位—出错,AX:错误代码。

4.中断21H的功能57H、子功能01H

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新小学教育C语言课程设计(图形编程 全)(2)全文阅读和word下载服务。

C语言课程设计(图形编程 全)(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1420844.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top