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

📄 ecb_enc.c

📁 Netscape公司提供的安全套接字层
💻 C
字号:
/* ecb_enc.c */
/* Copyright (C) 1993 Eric Young - see README for more details */
#include "des_locl.h"
#include "spr.h"

int des_ecb_encrypt(input,output,ks,encrypt)
des_cblock *input;
des_cblock *output;
des_key_schedule ks;
int encrypt;
    {
    register unsigned long l0,l1;
    register unsigned char *in,*out;
    unsigned long ll[2];

    in=(unsigned char *)input;
    out=(unsigned char *)output;
    c2l(in,l0);
    c2l(in,l1);
    ll[0]=l0;
    ll[1]=l1;
    des_encrypt(ll,ll,ks,encrypt);
    l0=ll[0];
    l1=ll[1];
    l2c(l0,out);
    l2c(l1,out);
    l0=l1=ll[0]=ll[1]=0;
    return(0);
    }

int des_encrypt(input,output,ks,encrypt)
unsigned long *input;
unsigned long *output;
des_key_schedule ks;
int encrypt;
    {
    register unsigned long l,r,t,u;
#ifdef ALT_ECB
    register unsigned char *des_SP=(unsigned char *)des_SPtrans;
#endif
#ifdef MSDOS
    union fudge {
        unsigned long  l;
        unsigned short s[2];
        unsigned char  c[4];
        } U,T;
#endif
    register int i;
    register unsigned long *s;

    l=input[0];
    r=input[1];

    /* do IP */
    PERM_OP(r,l,t, 4,0x0f0f0f0f);
    PERM_OP(l,r,t,16,0x0000ffff);
    PERM_OP(r,l,t, 2,0x33333333);
    PERM_OP(l,r,t, 8,0x00ff00ff);
    PERM_OP(r,l,t, 1,0x55555555);
    /* r and l are reversed - remember that :-) - fix
     * it in the next step */

    /* Things have been modified so that the initial rotate is
     * done outside the loop.  This required the
     * des_SPtrans values in sp.h to be rotated 1 bit to the right.
     * One perl script later and things have a 5% speed up on a sparc2.
     * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
     * for pointing this out. */
    t=(r<<1)|(r>>31);
    r=(l<<1)|(l>>31);
    l=t;

    /* clear the top bits on machines with 8byte longs */
    l&=0xffffffff;
    r&=0xffffffff;

    s=(unsigned long *)ks;
    /* I don't know if it is worth the effort of loop unrolling the
     * inner loop */
    if (encrypt)
        {
        for (i=0; i<32; i+=4)
            {
            D_ENCRYPT(l,r,i+0); /*  1 */
            D_ENCRYPT(r,l,i+2); /*  2 */
            }
        }
    else
        {
        for (i=30; i>0; i-=4)
            {
            D_ENCRYPT(l,r,i-0); /* 16 */
            D_ENCRYPT(r,l,i-2); /* 15 */
            }
        }
    l=(l>>1)|(l<<31);
    r=(r>>1)|(r<<31);
    /* clear the top bits on machines with 8byte longs */
    l&=0xffffffff;
    r&=0xffffffff;

    /* swap l and r
     * we will not do the swap so just remember they are
     * reversed for the rest of the subroutine
     * luckily FP fixes this problem :-) */

    PERM_OP(r,l,t, 1,0x55555555);
    PERM_OP(l,r,t, 8,0x00ff00ff);
    PERM_OP(r,l,t, 2,0x33333333);
    PERM_OP(l,r,t,16,0x0000ffff);
    PERM_OP(r,l,t, 4,0x0f0f0f0f);

    output[0]=l;
    output[1]=r;
    l=r=t=u=0;
    return(0);
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -