⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.c

📁 一个DES、3DES加解密的库文件
💻 C
📖 第 1 页 / 共 2 页
字号:
			else if (flag3 && bflag)				for (i=0; i<l; i+=8)					des_3ecb_encrypt(						(des_cblock *)&(buf[i]),						(des_cblock *)&(obuf[i]),						ks,ks2,do_encrypt);			else if (flag3 && !bflag)				{				char tmpbuf[8];				if (rem) bcopy(&(buf[l]),tmpbuf,rem);				des_3cbc_encrypt(					(des_cblock *)buf,(des_cblock *)obuf,					(long)l,ks,ks2,(des_cblock *)iv,					(des_cblock *)iv2,do_encrypt);				if (rem) bcopy(tmpbuf,&(buf[l]),rem);				}			else				{				des_cbc_encrypt(					(des_cblock *)buf,(des_cblock *)obuf,					(long)l,ks,(des_cblock *)iv,do_encrypt);				if (l >= 8) bcopy(&(obuf[l-8]),iv,8);				}			if (rem) bcopy(&(buf[l]),buf,rem);			i=0;			while (i < l)				{				if (uflag)					j=uufwrite(obuf,1,l-i,DES_OUT);				else					j=fwrite(obuf,1,l-i,DES_OUT);				if (j == -1)					{					perror("Write error");					Exit=7;					goto problems;					}				i+=j;				}			if (feof(DES_IN))				{				if (uflag) uufwriteEnd(DES_OUT);				break;				}			}		}	else /* decrypt */		{		ex=1;		for (;;)			{			if (ex) {				if (uflag)					l=uufread(buf,1,BUFSIZE,DES_IN);				else					l=fread(buf,1,BUFSIZE,DES_IN);				ex=0;				rem=l%8;				l-=rem;				}			if (l < 0)				{				perror("read error");				Exit=6;				goto problems;				}			if (bflag && !flag3)				for (i=0; i<l; i+=8)					des_ecb_encrypt(						(des_cblock *)&(buf[i]),						(des_cblock *)&(obuf[i]),						ks,do_encrypt);			else if (flag3 && bflag)				for (i=0; i<l; i+=8)					des_3ecb_encrypt(						(des_cblock *)&(buf[i]),						(des_cblock *)&(obuf[i]),						ks,ks2,do_encrypt);			else if (flag3 && !bflag)				{				des_3cbc_encrypt(					(des_cblock *)buf,(des_cblock *)obuf,					(long)l,ks,ks2,(des_cblock *)iv,					(des_cblock *)iv2,do_encrypt);				}			else				{				des_cbc_encrypt(					(des_cblock *)buf,(des_cblock *)obuf,				 	(long)l,ks,(des_cblock *)iv,do_encrypt);				if (l >= 8) bcopy(&(buf[l-8]),iv,8);				}			if (uflag)				ll=uufread(&(buf[rem]),1,BUFSIZE,DES_IN);			else				ll=fread(&(buf[rem]),1,BUFSIZE,DES_IN);			ll+=rem;			rem=ll%8;			ll-=rem;			if (feof(DES_IN) && (ll == 0))				{				last=obuf[l-1];				if ((last > 7) || (last < 0))					{					fputs("The file was not decrypted correctly.\n",						stderr);					/*Exit=8;					goto problems;*/					last=0;					}				l=l-8+last;				}			i=0;			if (cflag) des_cbc_cksum((C_Block *)obuf,				(C_Block *)cksum,(long)l/8*8,ks,				(C_Block *)cksum);			while (i != l)				{				j=fwrite(obuf,1,l-i,DES_OUT);				if (j == -1)					{					perror("Write error");					Exit=7;					goto problems;					}				i+=j;				}			l=ll;			if ((l == 0) && feof(DES_IN)) break;			}		}	if (cflag)		{		l=0;		if (cksumname[0] != '\0')			{			if ((O=fopen(cksumname,"w")) != NULL)				{				CKSUM_OUT=O;				l=1;				}			}		for (i=0; i<8; i++)			fprintf(CKSUM_OUT,"%02X",cksum[i]);		fprintf(CKSUM_OUT,"\n");		if (l) fclose(CKSUM_OUT);		}problems:	bzero(buf,sizeof(buf));	bzero(obuf,sizeof(obuf));	bzero(ks,sizeof(ks));	bzero(ks2,sizeof(ks2));	bzero(iv,sizeof(iv));	bzero(iv2,sizeof(iv2));	bzero(iv3,sizeof(iv3));	bzero(kk,sizeof(kk));	bzero(k2,sizeof(k2));	bzero(uubuf,sizeof(uubuf));	bzero(b,sizeof(b));	bzero(bb,sizeof(bb));	bzero(cksum,sizeof(cksum));	if (Exit) EXIT(Exit);	}int uufwrite(data,size,num,fp)char *data;int size; /* We ignore this parameter but it should be > ~50 I believe */int num;FILE *fp;	{	int i,j,left,rem,ret=num;	static int start=1;	if (start)		{		fprintf(fp,"begin 600 %s\n",			(uuname[0] == '\0')?"text.d":uuname);		start=0;		}	if (uubufnum)		{		if (uubufnum+num < 45)			{			bcopy(data,&(uubuf[uubufnum]),num);			uubufnum+=num;			return(num);			}		else			{			i=45-uubufnum;			bcopy(data,&(uubuf[uubufnum]),i);			j=uuencode(uubuf,45,b);			fwrite(b,1,j,fp);			uubufnum=0;			data+=i;			num-=i;			}		}	for (i=0; i<(num-INUUBUFN); i+=INUUBUFN)		{		j=uuencode(&(data[i]),INUUBUFN,b);		fwrite(b,1,j,fp);		}	rem=(num-i)%45;	left=(num-i-rem);	if (left)		{		j=uuencode(&(data[i]),left,b);		fwrite(b,1,j,fp);		i+=left;		}	if (i != num)		{		bcopy(&(data[i]),uubuf,rem);		uubufnum=rem;		}	return(ret);	}int uufwriteEnd(fp)FILE *fp;	{	int j;	static char *end=" \nend\n";	if (uubufnum != 0)		{		uubuf[uubufnum]='\0';		uubuf[uubufnum+1]='\0';		uubuf[uubufnum+2]='\0';		j=uuencode(uubuf,uubufnum,b);		fwrite(b,1,j,fp);		}	fwrite(end,1,strlen(end),fp);	}int uufread(out,size,num,fp)char *out;int size; /* should always be > ~ 60; I actually ignore this parameter :-) */int num;FILE *fp;	{	int i,j,tot;	static int done=0;	static int valid=0;	static int start=1;	if (start)		{		for (;;)			{			b[0]='\0';			fgets(b,300,fp);			if (b[0] == '\0')				{				fprintf(stderr,"no 'begin' found in uuencoded input\n");				return(-1);				}			if (strncmp(b,"begin ",6) == 0) break;			}		start=0;		}	if (done) return(0);	tot=0;	if (valid)		{		bcopy(bb,out,valid);		tot=valid;		valid=0;		}	for (;;)		{		b[0]='\0';		fgets(b,300,fp);		if (b[0] == '\0') break;		i=strlen(b);		if ((b[0] == 'e') && (b[1] == 'n') && (b[2] == 'd'))			{			done=1;			while (!feof(fp))				{				fgets(b,300,fp);				}			break;			}		i=uudecode(b,i,bb);		if (i < 0) break;		if ((i+tot+8) > num)			{			/* num to copy to make it a multiple of 8 */			j=(num/8*8)-tot-8;			bcopy(bb,&(out[tot]),j);			tot+=j;			bcopy(&(bb[j]),bb,i-j);			valid=i-j;			break;			}		bcopy(bb,&(out[tot]),i);		tot+=i;		}	return(tot);	}#define ccc2l(c,l)      (l =((unsigned long)(*((c)++)))<<16, \			 l|=((unsigned long)(*((c)++)))<< 8, \		 	 l|=((unsigned long)(*((c)++))))#define l2ccc(l,c)      (*((c)++)=(unsigned char)(((l)>>16)&0xff), \                         *((c)++)=(unsigned char)(((l)>> 8)&0xff), \                         *((c)++)=(unsigned char)(((l)    )&0xff))int uuencode(in,num,out)unsigned char *in;int num;unsigned char *out;	{	int j,i,k,n,tot=0;	unsigned long l;	register unsigned char *p;	p=out;	for (j=0; j<num; j+=45)		{		if (j+45 > num)			i=(num-j);		else	i=45;		*(p++)=i+' ';		for (n=0; n<i; n+=3)			{			ccc2l(in,l);			*(p++)=((l>>18)&0x3f)+' ';			*(p++)=((l>>12)&0x3f)+' ';			*(p++)=((l>> 6)&0x3f)+' ';			*(p++)=((l    )&0x3f)+' ';			tot+=4;			}		*(p++)='\n';		tot+=2;		}	*p='\0';	l=0;	return(tot);	}int uudecode(in,num,out)unsigned char *in;int num;unsigned char *out;	{	int j,i,k;	unsigned int n,space=0;	unsigned long l;	unsigned long w,x,y,z;	unsigned int blank='\n'-' ';	for (j=0; j<num; )		{		n= *(in++)-' ';		if (n == blank)			{			n=0;			in--;			}		if (n > 60)			{			fprintf(stderr,"uuencoded line length too long\n");			return(-1);			}		j++;		for (i=0; i<n; j+=4,i+=3)			{			/* the following is for cases where spaces are			 * removed from lines.			 */			if (space)				{				w=x=y=z=0;				}			else				{				w= *(in++)-' ';				x= *(in++)-' ';				y= *(in++)-' ';				z= *(in++)-' ';				}			if ((w > 63) || (x > 63) || (y > 63) || (z > 63))				{				k=0;				if (w == blank) k=1;				if (x == blank) k=2;				if (y == blank) k=3;				if (z == blank) k=4;				space=1;				switch (k) {				case 1:	w=0; in--;				case 2: x=0; in--;				case 3: y=0; in--;				case 4: z=0; in--;					break;				case 0:					space=0;					fprintf(stderr,"bad uuencoded data values\n");					w=x=y=z=0;					return(-1);					break;					}				}			l=(w<<18)|(x<<12)|(y<< 6)|(z    );			l2ccc(l,out);			}		if (*(in++) != '\n')			{			fprintf(stderr,"missing nl in uuencoded line\n");			w=x=y=z=0;			return(-1);			}		j++;		}	*out='\0';	w=x=y=z=0;	return(n);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -