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

📄 des.c

📁 Netscape公司提供的安全套接字层
💻 C
📖 第 1 页 / 共 2 页
字号:
            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 + -