📄 des.c
字号:
{
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))
{
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;
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<(((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(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 =((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(in, num, out)
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(in, num, out)
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 + -