📄 des.c
字号:
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 + -