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>
②password <文件名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下载服务。
相关推荐: