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

📄 des.c

📁 IP网络语音通讯软件源代码. 不可多得的语音源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                                perror("read error");
								Exit=6;
								goto problems;
								}

						rem=l%8;
						len=l-rem;
						if (feof(DES_IN))
								{
								srandom((unsigned int)time(NULL));
								for (i=7-rem; i>0; i--)
										buf[l++]=random()&0xff;
								buf[l++]=rem;
								ex=1;
								len+=rem;
								}
						else
								l-=rem;

						if (cflag)
								{
								des_cbc_cksum((C_Block *)buf,(C_Block *)cksum,
										(long)len,ks,(C_Block *)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,(des_cblock *)iv,
										(des_cblock *)iv2,do_encrypt);
								if (rem) memcpy(&(buf[l]),tmpbuf,
										(unsigned int)rem);
								}
						else
								{
								des_cbc_encrypt(
										(des_cblock *)buf,(des_cblock *)obuf,
										(long)l,ks,(des_cblock *)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,(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) 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;
										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,(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:
		memset(buf,0,sizeof(buf));
		memset(obuf,0,sizeof(obuf));
		memset(ks,0,sizeof(ks));
		memset(ks2,0,sizeof(ks2));
		memset(iv,0,sizeof(iv));
		memset(iv2,0,sizeof(iv2));
		memset(kk,0,sizeof(kk));
		memset(k2,0,sizeof(k2));
		memset(uubuf,0,sizeof(uubuf));
		memset(b,0,sizeof(b));
		memset(bb,0,sizeof(bb));
		memset(cksum,0,sizeof(cksum));
		if (Exit) EXIT(Exit);
		}

int uufwrite(data, size, num, fp)
unsigned char *data;
int size;
unsigned int num;
FILE *fp;
	  
	 /* We ignore this parameter but it should be > ~50 I believe */
   
	
		{
		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<(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(fp)
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 uufread(out, size, num, fp)
unsigned char *out;
int size; /* should always be > ~ 60; I actually ignore this parameter :-) */
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 =((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,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=0,space=0;
		unsigned long l;
		unsigned 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 + -