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