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

📄 des.c

📁 des加解密算法程序包
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* first read */	if (eflag || (!dflag && cflag))		{		for (;;)			{			num=l=fread(&(buf[rem]),1,BUFSIZE,DES_IN);			l+=rem;			num+=rem;			if (l < 0)				{				perror("read error");				Exit=6;				goto problems;				}			rem=l%8;			len=l-rem;			if (feof(DES_IN))				{				for (i=7-rem; i>0; i--)					RAND_pseudo_bytes(buf + l++, 1);				buf[l++]=rem;				ex=1;				len+=rem;				}			else				l-=rem;			if (cflag)				{				DES_cbc_cksum(buf,&cksum,					(long)len,&ks,&cksum);				if (!eflag)					{					if (feof(DES_IN)) break;					else continue;					}				}			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_ecb2_encrypt(						(DES_cblock *)&(buf[i]),						(DES_cblock *)&(obuf[i]),						&ks,&ks2,do_encrypt);			else if (flag3 && !bflag)				{				char tmpbuf[8];				if (rem) memcpy(tmpbuf,&(buf[l]),					(unsigned int)rem);				DES_3cbc_encrypt(					(DES_cblock *)buf,(DES_cblock *)obuf,					(long)l,ks,ks2,&iv,					&iv2,do_encrypt);				if (rem) memcpy(&(buf[l]),tmpbuf,					(unsigned int)rem);				}			else				{				DES_cbc_encrypt(					buf,obuf,					(long)l,&ks,&iv,do_encrypt);				if (l >= 8) memcpy(iv,&(obuf[l-8]),8);				}			if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem);			i=0;			while (i < l)				{				if (uflag)					j=uufwrite(obuf,1,(unsigned int)l-i,						DES_OUT);				else					j=fwrite(obuf,1,(unsigned int)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_ecb2_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,&iv,					&iv2,do_encrypt);				}			else				{				DES_cbc_encrypt(					buf,obuf,				 	(long)l,&ks,&iv,do_encrypt);				if (l >= 8) memcpy(iv,&(buf[l-8]),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;					last=0;					}				l=l-8+last;				}			i=0;			if (cflag) DES_cbc_cksum(obuf,				(DES_cblock *)cksum,(long)l/8*8,&ks,				(DES_cblock *)cksum);			while (i != l)				{				j=fwrite(obuf,1,(unsigned int)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:	OPENSSL_cleanse(buf,sizeof(buf));	OPENSSL_cleanse(obuf,sizeof(obuf));	OPENSSL_cleanse(&ks,sizeof(ks));	OPENSSL_cleanse(&ks2,sizeof(ks2));	OPENSSL_cleanse(iv,sizeof(iv));	OPENSSL_cleanse(iv2,sizeof(iv2));	OPENSSL_cleanse(kk,sizeof(kk));	OPENSSL_cleanse(k2,sizeof(k2));	OPENSSL_cleanse(uubuf,sizeof(uubuf));	OPENSSL_cleanse(b,sizeof(b));	OPENSSL_cleanse(bb,sizeof(bb));	OPENSSL_cleanse(cksum,sizeof(cksum));	if (Exit) EXIT(Exit);	}/*    We ignore this parameter but it should be > ~50 I believe    */int uufwrite(unsigned char *data, int size, unsigned 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)			{			memcpy(&(uubuf[uubufnum]),data,(unsigned int)num);			uubufnum+=num;			return(num);			}		else			{			i=45-uubufnum;			memcpy(&(uubuf[uubufnum]),data,(unsigned int)i);			j=uuencode((unsigned char *)uubuf,45,b);			fwrite(b,1,(unsigned int)j,fp);			uubufnum=0;			data+=i;			num-=i;			}		}	for (i=0; i<(((int)num)-INUUBUFN); i+=INUUBUFN)		{		j=uuencode(&(data[i]),INUUBUFN,b);		fwrite(b,1,(unsigned int)j,fp);		}	rem=(num-i)%45;	left=(num-i-rem);	if (left)		{		j=uuencode(&(data[i]),left,b);		fwrite(b,1,(unsigned int)j,fp);		i+=left;		}	if (i != num)		{		memcpy(uubuf,&(data[i]),(unsigned int)rem);		uubufnum=rem;		}	return(ret);	}void uufwriteEnd(FILE *fp)	{	int j;	static const 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,(unsigned int)j,fp);		}	fwrite(end,1,strlen(end),fp);	}/* int size:  should always be > ~ 60; I actually ignore this parameter :-)    */int uufread(unsigned char *out, int size, unsigned 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((char *)b,300,fp);			if (b[0] == '\0')				{				fprintf(stderr,"no 'begin' found in uuencoded input\n");				return(-1);				}			if (strncmp((char *)b,"begin ",6) == 0) break;			}		start=0;		}	if (done) return(0);	tot=0;	if (valid)		{		memcpy(out,bb,(unsigned int)valid);		tot=valid;		valid=0;		}	for (;;)		{		b[0]='\0';		fgets((char *)b,300,fp);		if (b[0] == '\0') break;		i=strlen((char *)b);		if ((b[0] == 'e') && (b[1] == 'n') && (b[2] == 'd'))			{			done=1;			while (!feof(fp))				{				fgets((char *)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;			memcpy(&(out[tot]),bb,(unsigned int)j);			tot+=j;			memcpy(bb,&(bb[j]),(unsigned int)i-j);			valid=i-j;			break;			}		memcpy(&(out[tot]),bb,(unsigned int)i);		tot+=i;		}	return(tot);	}#define ccc2l(c,l)      (l =((DES_LONG)(*((c)++)))<<16, \			 l|=((DES_LONG)(*((c)++)))<< 8, \		 	 l|=((DES_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(unsigned char *in, int num, unsigned char *out)	{	int j,i,n,tot=0;	DES_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(unsigned char *in, int num, unsigned char *out)	{	int j,i,k;	unsigned int n=0,space=0;	DES_LONG l;	DES_LONG w,x,y,z;	unsigned int blank=(unsigned int)'\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 + -