首页
社区
课程
招聘
请教,关于DES算法在反汇编情况下的特征?
发表于: 2004-11-22 14:17 7939

请教,关于DES算法在反汇编情况下的特征?

2004-11-22 14:17
7939
各位达人,如果用IDA或OD导入一个有DES算法的程序,它有什么特征?

在IDA中,没有找到例如  DESCRYPT的函数

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (14)
雪    币: 231
活跃值: (115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
找S-Box
2004-11-22 14:48
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
3
密钥56比特
2004-11-22 15:32
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 ferrari_fei 发布
各位达人,如果用IDA或OD导入一个有DES算法的程序,它有什么特征?


在IDA中,没有找到例如 DESCRYPT的函数


基本上经过DES加密的密文毫无特征可言,
因为混乱(Confusion)和混乱(Diffusion)是DES的基本特征,
也是它能成为数据加密标准的必要条件.

所以如果64位的分组即使63位相同,1位不同结果就会完全不同.
所以唯一有可能就是对有完全相同的分组加密.

这种情况只有在理论上有可能实现,譬如对TCP/IP报头的某些字段
的加密,对系统路径的加密.这就要求对协议和系统说白了就是
加密内容本身极其掌握.hehe.
唯密文攻击是不可能了,选择密文攻击好象只有这些了.
2004-11-22 18:30
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
5
evileast:楼主问的是识别des的汇编代码段,不是识别密文。
我是这样理解的。
2004-11-22 19:26
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
6
都有道理 :)
Shannon提出用Confusion(扰乱) & Deffusion(扩散)交替的方法构造乘积密码
对于识别DES汇编代码段我想仅仅靠识别S-Box并不一定能确定是DES
56位密钥也不一定的说:)
为什么不两个结合起来呢?
对于BlowFish&DES有很多相同的地方,它们都是对称分组密码,都是
基于Feistel密码结构
2004-11-22 21:24
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
7
s盒 是不可靠的
我见过一种des,对s盒次序作了调整,但实质上没有改变
因为其他的次序也相应调整了

56位密钥,我目前还不知道有其他算法采用
2004-11-22 21:39
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 wsy 发布
evileast:楼主问的是识别des的汇编代码段,不是识别密文。
我是这样理解的。
2004-11-22 22:12
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
9
最初由 wsy 发布
s盒 是不可靠的
我见过一种des,对s盒次序作了调整,但实质上没有改变
因为其他的次序也相应调整了

56位密钥,我目前还不知道有其他算法采用


即使S盒子改变了,它还是DES
2004-11-23 12:05
0
雪    币: 211
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
记得DES里面不是有一个扩散函数么?就是把56位的密钥弄的和64位分组相匹配的那个东西,把每相隔几位的特定位拿出来错一下位充数,本人估计应该有相临的AND语句和内存56位结构读写语句,用来把特定的位提取出来,可是这个算不算特征就不知道了,别的算法应该也有相似的函数,但是仔细分析一下,应该可以看出端倪来吧??
2004-11-23 13:23
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
11
即使S盒子改变了,它还是DES

但是,不能用找s盒来确定DES
2004-11-23 21:12
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
12
好像,看S盒也可以
要注意用法,不是内容
是6进4出
2004-11-23 21:35
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
13
DES算法的关键就在S盒,只要4轮S盒下来,在Confusion与Deffusion就有了极好的效果.
至今为止,官方始终未公布与证明S盒这样取法的原因,很多人提出质疑,但只要稍微改动S盒一位,强度就大打折扣,实践得出结论,找不到比这个更优的S盒

我曾经在分析某网络游戏时,看到过这样一个算法,表面上看上去与标准的des算法完全无关,但其实质是相同的。对于确定这些比庞大复杂的加密算法,我觉得比较好的办法是找出它们使用的常数与,然后google一下....

/*
* authdes.c - an implementation of the DES cipher algorithm for NTP
*/
#include <sys/types.h>

#include <netinet/in.h>

#if BYTE_ORDER == BIG_ENDIAN
#define XNTP_BIG_ENDIAN
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
#define XNTP_LITTLE_ENDIAN
#endif

/*
* There are two entries in here.  auth_subkeys() called to
* compute the encryption and decryption key schedules, while
* auth_des() is called to do the actual encryption/decryption
*/

/*
* Byte order woes.  The DES code is sensitive to byte order.  This
* used to be resolved by calling ntohl() and htonl() to swap things
* around, but this turned out to be quite costly on Vaxes where those
* things are actual functions.  The code now straightens out byte
* order troubles on its own, with no performance penalty for little
* end first machines, but at great expense to cleanliness.
*/
#if !defined(XNTP_BIG_ENDIAN) && !defined(XNTP_LITTLE_ENDIAN)
        /*
         * Pick one or the other.
         */
        BYTE_ORDER_NOT_DEFINED_FOR_AUTHENTICATION
#endif

/*
* Key setup.  Here we entirely permute a key, saving the results
* for both the encryption and decryption.  Note that while the
* decryption subkeys are simply the encryption keys reordered,
* we save both so that a common cipher routine may be used.
*/

/*
* Permuted choice 1 tables.  These are used to extract bits
* from the left and right parts of the key to form Ci and Di.
* The code that uses these tables knows which bits from which
* part of each key are used to form Ci and Di.
*/
static u_long PC1_CL[8] = {
        0x00000000, 0x00000010, 0x00001000, 0x00001010,
        0x00100000, 0x00100010, 0x00101000, 0x00101010
};

static u_long PC1_DL[16] = {
        0x00000000, 0x00100000, 0x00001000, 0x00101000,
        0x00000010, 0x00100010, 0x00001010, 0x00101010,
        0x00000001, 0x00100001, 0x00001001, 0x00101001,
        0x00000011, 0x00100011, 0x00001011, 0x00101011
};

static u_long PC1_CR[16] = {
        0x00000000, 0x00000001, 0x00000100, 0x00000101,
        0x00010000, 0x00010001, 0x00010100, 0x00010101,
        0x01000000, 0x01000001, 0x01000100, 0x01000101,
        0x01010000, 0x01010001, 0x01010100, 0x01010101
};

static u_long PC1_DR[8] = {
        0x00000000, 0x01000000, 0x00010000, 0x01010000,
        0x00000100, 0x01000100, 0x00010100, 0x01010100
};

/*
* At the start of some iterations of the key schedule we do
* a circular left shift by one place, while for others we do a shift by
* two places.  This has bits set for the iterations where we do 2 bit
* shifts, starting at the low order bit.
*/
#define        TWO_BIT_SHIFTS        0x7efc

/*
* Permuted choice 2 tables.  The first actually produces the low order
* 24 bits of the subkey Ki from the 28 bit value of Ci.  The second produces
* the high order 24 bits from Di.  The tables are indexed by six bit
* segments of Ci and Di respectively.  The code is handcrafted to compute
* the appropriate 6 bit chunks.
*
* Note that for ease of computation, the 24 bit values are produced with
* six bits going into each byte.
*/
static u_long PC2_C[4][64] = {
        0x00000000, 0x00040000, 0x01000000, 0x01040000,
        0x00000400, 0x00040400, 0x01000400, 0x01040400,
        0x00200000, 0x00240000, 0x01200000, 0x01240000,
        0x00200400, 0x00240400, 0x01200400, 0x01240400,
        0x00000001, 0x00040001, 0x01000001, 0x01040001,
        0x00000401, 0x00040401, 0x01000401, 0x01040401,
        0x00200001, 0x00240001, 0x01200001, 0x01240001,
        0x00200401, 0x00240401, 0x01200401, 0x01240401,
        0x02000000, 0x02040000, 0x03000000, 0x03040000,
        0x02000400, 0x02040400, 0x03000400, 0x03040400,
        0x02200000, 0x02240000, 0x03200000, 0x03240000,
        0x02200400, 0x02240400, 0x03200400, 0x03240400,
        0x02000001, 0x02040001, 0x03000001, 0x03040001,
        0x02000401, 0x02040401, 0x03000401, 0x03040401,
        0x02200001, 0x02240001, 0x03200001, 0x03240001,
        0x02200401, 0x02240401, 0x03200401, 0x03240401,

        0x00000000, 0x00000002, 0x00000800, 0x00000802,
        0x08000000, 0x08000002, 0x08000800, 0x08000802,
        0x00010000, 0x00010002, 0x00010800, 0x00010802,
        0x08010000, 0x08010002, 0x08010800, 0x08010802,
        0x00000100, 0x00000102, 0x00000900, 0x00000902,
        0x08000100, 0x08000102, 0x08000900, 0x08000902,
        0x00010100, 0x00010102, 0x00010900, 0x00010902,
        0x08010100, 0x08010102, 0x08010900, 0x08010902,
        0x00000010, 0x00000012, 0x00000810, 0x00000812,
        0x08000010, 0x08000012, 0x08000810, 0x08000812,
        0x00010010, 0x00010012, 0x00010810, 0x00010812,
        0x08010010, 0x08010012, 0x08010810, 0x08010812,
        0x00000110, 0x00000112, 0x00000910, 0x00000912,
        0x08000110, 0x08000112, 0x08000910, 0x08000912,
        0x00010110, 0x00010112, 0x00010910, 0x00010912,
        0x08010110, 0x08010112, 0x08010910, 0x08010912,

        0x00000000, 0x04000000, 0x00002000, 0x04002000,
        0x10000000, 0x14000000, 0x10002000, 0x14002000,
        0x00000020, 0x04000020, 0x00002020, 0x04002020,
        0x10000020, 0x14000020, 0x10002020, 0x14002020,
        0x00080000, 0x04080000, 0x00082000, 0x04082000,
        0x10080000, 0x14080000, 0x10082000, 0x14082000,
        0x00080020, 0x04080020, 0x00082020, 0x04082020,
        0x10080020, 0x14080020, 0x10082020, 0x14082020,
        0x20000000, 0x24000000, 0x20002000, 0x24002000,
        0x30000000, 0x34000000, 0x30002000, 0x34002000,
        0x20000020, 0x24000020, 0x20002020, 0x24002020,
        0x30000020, 0x34000020, 0x30002020, 0x34002020,
        0x20080000, 0x24080000, 0x20082000, 0x24082000,
        0x30080000, 0x34080000, 0x30082000, 0x34082000,
        0x20080020, 0x24080020, 0x20082020, 0x24082020,
        0x30080020, 0x34080020, 0x30082020, 0x34082020,

        0x00000000, 0x00100000, 0x00000008, 0x00100008,
        0x00000200, 0x00100200, 0x00000208, 0x00100208,
        0x00020000, 0x00120000, 0x00020008, 0x00120008,
        0x00020200, 0x00120200, 0x00020208, 0x00120208,
        0x00000004, 0x00100004, 0x0000000c, 0x0010000c,
        0x00000204, 0x00100204, 0x0000020c, 0x0010020c,
        0x00020004, 0x00120004, 0x0002000c, 0x0012000c,
        0x00020204, 0x00120204, 0x0002020c, 0x0012020c,
        0x00001000, 0x00101000, 0x00001008, 0x00101008,
        0x00001200, 0x00101200, 0x00001208, 0x00101208,
        0x00021000, 0x00121000, 0x00021008, 0x00121008,
        0x00021200, 0x00121200, 0x00021208, 0x00121208,
        0x00001004, 0x00101004, 0x0000100c, 0x0010100c,
        0x00001204, 0x00101204, 0x0000120c, 0x0010120c,
        0x00021004, 0x00121004, 0x0002100c, 0x0012100c,
        0x00021204, 0x00121204, 0x0002120c, 0x0012120c
};

static u_long PC2_D[4][64] = {
        0x00000000, 0x00000200, 0x00020000, 0x00020200,
        0x00000001, 0x00000201, 0x00020001, 0x00020201,
        0x08000000, 0x08000200, 0x08020000, 0x08020200,
        0x08000001, 0x08000201, 0x08020001, 0x08020201,
        0x00200000, 0x00200200, 0x00220000, 0x00220200,
        0x00200001, 0x00200201, 0x00220001, 0x00220201,
        0x08200000, 0x08200200, 0x08220000, 0x08220200,
        0x08200001, 0x08200201, 0x08220001, 0x08220201,
        0x00000002, 0x00000202, 0x00020002, 0x00020202,
        0x00000003, 0x00000203, 0x00020003, 0x00020203,
        0x08000002, 0x08000202, 0x08020002, 0x08020202,
        0x08000003, 0x08000203, 0x08020003, 0x08020203,
        0x00200002, 0x00200202, 0x00220002, 0x00220202,
        0x00200003, 0x00200203, 0x00220003, 0x00220203,
        0x08200002, 0x08200202, 0x08220002, 0x08220202,
        0x08200003, 0x08200203, 0x08220003, 0x08220203,

        0x00000000, 0x00000010, 0x20000000, 0x20000010,
        0x00100000, 0x00100010, 0x20100000, 0x20100010,
        0x00000800, 0x00000810, 0x20000800, 0x20000810,
        0x00100800, 0x00100810, 0x20100800, 0x20100810,
        0x04000000, 0x04000010, 0x24000000, 0x24000010,
        0x04100000, 0x04100010, 0x24100000, 0x24100010,
        0x04000800, 0x04000810, 0x24000800, 0x24000810,
        0x04100800, 0x04100810, 0x24100800, 0x24100810,
        0x00000004, 0x00000014, 0x20000004, 0x20000014,
        0x00100004, 0x00100014, 0x20100004, 0x20100014,
        0x00000804, 0x00000814, 0x20000804, 0x20000814,
        0x00100804, 0x00100814, 0x20100804, 0x20100814,
        0x04000004, 0x04000014, 0x24000004, 0x24000014,
        0x04100004, 0x04100014, 0x24100004, 0x24100014,
        0x04000804, 0x04000814, 0x24000804, 0x24000814,
        0x04100804, 0x04100814, 0x24100804, 0x24100814,

        0x00000000, 0x00001000, 0x00010000, 0x00011000,
        0x02000000, 0x02001000, 0x02010000, 0x02011000,
        0x00000020, 0x00001020, 0x00010020, 0x00011020,
        0x02000020, 0x02001020, 0x02010020, 0x02011020,
        0x00040000, 0x00041000, 0x00050000, 0x00051000,
        0x02040000, 0x02041000, 0x02050000, 0x02051000,
        0x00040020, 0x00041020, 0x00050020, 0x00051020,
        0x02040020, 0x02041020, 0x02050020, 0x02051020,
        0x00002000, 0x00003000, 0x00012000, 0x00013000,
        0x02002000, 0x02003000, 0x02012000, 0x02013000,
        0x00002020, 0x00003020, 0x00012020, 0x00013020,
        0x02002020, 0x02003020, 0x02012020, 0x02013020,
        0x00042000, 0x00043000, 0x00052000, 0x00053000,
        0x02042000, 0x02043000, 0x02052000, 0x02053000,
        0x00042020, 0x00043020, 0x00052020, 0x00053020,
        0x02042020, 0x02043020, 0x02052020, 0x02053020,

        0x00000000, 0x00000400, 0x01000000, 0x01000400,
        0x00000100, 0x00000500, 0x01000100, 0x01000500,
        0x10000000, 0x10000400, 0x11000000, 0x11000400,
        0x10000100, 0x10000500, 0x11000100, 0x11000500,
        0x00080000, 0x00080400, 0x01080000, 0x01080400,
        0x00080100, 0x00080500, 0x01080100, 0x01080500,
        0x10080000, 0x10080400, 0x11080000, 0x11080400,
        0x10080100, 0x10080500, 0x11080100, 0x11080500,
        0x00000008, 0x00000408, 0x01000008, 0x01000408,
        0x00000108, 0x00000508, 0x01000108, 0x01000508,
        0x10000008, 0x10000408, 0x11000008, 0x11000408,
        0x10000108, 0x10000508, 0x11000108, 0x11000508,
        0x00080008, 0x00080408, 0x01080008, 0x01080408,
        0x00080108, 0x00080508, 0x01080108, 0x01080508,
        0x10080008, 0x10080408, 0x11080008, 0x11080408,
        0x10080108, 0x10080508, 0x11080108, 0x11080508
};

/*
* Permute the key to give us our key schedule.
*/
void
DESauth_subkeys(key, encryptkeys, decryptkeys)
        u_long *key;
        u_char *encryptkeys;
        u_char *decryptkeys;
{
        register u_long tmp;
        register u_long c, d;
        register u_char *ek, *dk;
        register int two_bit_shifts;
        register int i;

        /*
         * The first permutted choice gives us the 28 bits for C0 and
         * 28 for D0.  C0 gets 12 bits from the left key and 16 from
         * the right, while D0 gets 16 from the left and 12 from the
         * right.  The code knows which bits go where.
         */
        tmp = *key;        /* left part of key */
        c =  PC1_CL[(tmp >> 29) & 0x7]
          | (PC1_CL[(tmp >> 21) & 0x7] << 1)
          | (PC1_CL[(tmp >> 13) & 0x7] << 2)
          | (PC1_CL[(tmp >>  5) & 0x7] << 3);
        d =  PC1_DL[(tmp >> 25) & 0xf]
          | (PC1_DL[(tmp >> 17) & 0xf] << 1)
          | (PC1_DL[(tmp >>  9) & 0xf] << 2)
          | (PC1_DL[(tmp >>  1) & 0xf] << 3);

        tmp = *(key+1);        /* right part of key */
        c |= PC1_CR[(tmp >> 28) & 0xf]
          | (PC1_CR[(tmp >> 20) & 0xf] << 1)
          | (PC1_CR[(tmp >> 12) & 0xf] << 2)
          | (PC1_CR[(tmp >>  4) & 0xf] << 3);
        d |= PC1_DR[(tmp >> 25) & 0x7]
          | (PC1_DR[(tmp >> 17) & 0x7] << 1)
          | (PC1_DR[(tmp >>  9) & 0x7] << 2)
          | (PC1_DR[(tmp >>  1) & 0x7] << 3);

        /*
         * Now iterate to compute the key schedule.  Note that we
         * record the entire set of subkeys in 6 bit chunks since
         * they are used that way.  At 6 bits/char, we need
         * 48/6 char's/subkey * 16 subkeys/encryption == 128 chars.
         * encryptkeys and decryptkeys must be this big.
         */
        ek = encryptkeys;
        dk = decryptkeys + (8 * 15);
        two_bit_shifts = TWO_BIT_SHIFTS;
        for (i = 16; i > 0; i--) {
                /*
                 * Do the rotation.  One bit and two bit rotations
                 * are done separately.  Note C and D are 28 bits.
                 */
                if (two_bit_shifts & 0x1) {
                        c = ((c << 2) & 0xffffffc) | (c >> 26);
                        d = ((d << 2) & 0xffffffc) | (d >> 26);
                } else {
                        c = ((c << 1) & 0xffffffe) | (c >> 27);
                        d = ((d << 1) & 0xffffffe) | (d >> 27);
                }
                two_bit_shifts >>= 1;

                /*
                 * Apply permutted choice 2 to C to get the first
                 * 24 bits worth of keys.  Note that bits 9, 18, 22
                 * and 25 (using DES numbering) in C are unused.  The
                 * shift-mask stuff is done to delete these bits from
                 * the indices, since this cuts the table size in half.
                 */
                tmp = PC2_C[0][((c >> 22) & 0x3f)]
                    | PC2_C[1][((c >> 15) & 0xf) | ((c >> 16) & 0x30)]
                    | PC2_C[2][((c >>  4) & 0x3) | ((c >>  9) & 0x3c)]
                    | PC2_C[3][((c      ) & 0x7) | ((c >>  4) & 0x38)];
                *ek++ = *dk++ = (u_char)(tmp >> 24);
                *ek++ = *dk++ = (u_char)(tmp >> 16);
                *ek++ = *dk++ = (u_char)(tmp >>  8);
                *ek++ = *dk++ = (u_char)tmp;

                /*
                 * Apply permutted choice 2 to D to get the other half.
                 * Here, bits 7, 10, 15 and 26 go unused.  The sqeezing
                 * actually turns out to be cheaper here.
                 */
                tmp = PC2_D[0][((d >> 22) & 0x3f)]
                    | PC2_D[1][((d >> 14) & 0xf) | ((d >> 15) & 0x30)]
                    | PC2_D[2][((d >>  7) & 0x3f)]
                    | PC2_D[3][((d      ) & 0x3) | ((d >>  1) & 0x3c)];
                *ek++ = *dk++ = (u_char)(tmp >> 24);
                *ek++ = *dk++ = (u_char)(tmp >> 16);
                *ek++ = *dk++ = (u_char)(tmp >>  8);
                *ek++ = *dk++ = (u_char)tmp;

                /*
                 * We are filling in the decryption subkeys from the end.
                 * Space it back 16 elements to get to the start of the
                 * next set.
                 */
                dk -= 16;
        }
}

/*
* The DES algorithm.  This is intended to be fairly speedy at the
* expense of some memory.
*
* This uses all the standard hacks.  The S boxes and the P permutation
* are precomputed into one table.  The E box never actually appears
* explicitly since it is easy to apply this algorithmically.  The
* initial permutation and final (inverse initial) permuation are
* computed from tables designed to permute four bits at a time.  This
* should run pretty fast on machines with 32 bit words and
* bit field/multiple bit shift instructions which are fast.
*/

/*
* The initial permutation array.  This is used to compute both the
* left and the right halves of the initial permutation using bytes
* from words made from the following operations:
*
* ((left & 0x55555555) << 1) | (right & 0x55555555)  for left half
* (left & 0xaaaaaaaa) | ((right & 0xaaaaaaaa) >> 1)  for right half
*
* The scheme is that we index into the table using each byte.  The
* result from the high order byte is or'd with the result from the
* next byte shifted left once is or'd with the result from the next
* byte shifted left twice if or'd with the result from the low order
* byte shifted left by three.  Clear?
*/
static u_long IP[256] = {
        0x00000000, 0x00000010, 0x00000001, 0x00000011,
        0x00001000, 0x00001010, 0x00001001, 0x00001011,
        0x00000100, 0x00000110, 0x00000101, 0x00000111,
        0x00001100, 0x00001110, 0x00001101, 0x00001111,
        0x00100000, 0x00100010, 0x00100001, 0x00100011,
        0x00101000, 0x00101010, 0x00101001, 0x00101011,
        0x00100100, 0x00100110, 0x00100101, 0x00100111,
        0x00101100, 0x00101110, 0x00101101, 0x00101111,
        0x00010000, 0x00010010, 0x00010001, 0x00010011,
        0x00011000, 0x00011010, 0x00011001, 0x00011011,
        0x00010100, 0x00010110, 0x00010101, 0x00010111,
        0x00011100, 0x00011110, 0x00011101, 0x00011111,
        0x00110000, 0x00110010, 0x00110001, 0x00110011,
        0x00111000, 0x00111010, 0x00111001, 0x00111011,
        0x00110100, 0x00110110, 0x00110101, 0x00110111,
        0x00111100, 0x00111110, 0x00111101, 0x00111111,
        0x10000000, 0x10000010, 0x10000001, 0x10000011,
        0x10001000, 0x10001010, 0x10001001, 0x10001011,
        0x10000100, 0x10000110, 0x10000101, 0x10000111,
        0x10001100, 0x10001110, 0x10001101, 0x10001111,
        0x10100000, 0x10100010, 0x10100001, 0x10100011,
        0x10101000, 0x10101010, 0x10101001, 0x10101011,
        0x10100100, 0x10100110, 0x10100101, 0x10100111,
        0x10101100, 0x10101110, 0x10101101, 0x10101111,
        0x10010000, 0x10010010, 0x10010001, 0x10010011,
        0x10011000, 0x10011010, 0x10011001, 0x10011011,
        0x10010100, 0x10010110, 0x10010101, 0x10010111,
        0x10011100, 0x10011110, 0x10011101, 0x10011111,
        0x10110000, 0x10110010, 0x10110001, 0x10110011,
        0x10111000, 0x10111010, 0x10111001, 0x10111011,
        0x10110100, 0x10110110, 0x10110101, 0x10110111,
        0x10111100, 0x10111110, 0x10111101, 0x10111111,
        0x01000000, 0x01000010, 0x01000001, 0x01000011,
        0x01001000, 0x01001010, 0x01001001, 0x01001011,
        0x01000100, 0x01000110, 0x01000101, 0x01000111,
        0x01001100, 0x01001110, 0x01001101, 0x01001111,
        0x01100000, 0x01100010, 0x01100001, 0x01100011,
        0x01101000, 0x01101010, 0x01101001, 0x01101011,
        0x01100100, 0x01100110, 0x01100101, 0x01100111,
        0x01101100, 0x01101110, 0x01101101, 0x01101111,
        0x01010000, 0x01010010, 0x01010001, 0x01010011,
        0x01011000, 0x01011010, 0x01011001, 0x01011011,
        0x01010100, 0x01010110, 0x01010101, 0x01010111,
        0x01011100, 0x01011110, 0x01011101, 0x01011111,
        0x01110000, 0x01110010, 0x01110001, 0x01110011,
        0x01111000, 0x01111010, 0x01111001, 0x01111011,
        0x01110100, 0x01110110, 0x01110101, 0x01110111,
        0x01111100, 0x01111110, 0x01111101, 0x01111111,
        0x11000000, 0x11000010, 0x11000001, 0x11000011,
        0x11001000, 0x11001010, 0x11001001, 0x11001011,
        0x11000100, 0x11000110, 0x11000101, 0x11000111,
        0x11001100, 0x11001110, 0x11001101, 0x11001111,
        0x11100000, 0x11100010, 0x11100001, 0x11100011,
        0x11101000, 0x11101010, 0x11101001, 0x11101011,
        0x11100100, 0x11100110, 0x11100101, 0x11100111,
        0x11101100, 0x11101110, 0x11101101, 0x11101111,
        0x11010000, 0x11010010, 0x11010001, 0x11010011,
        0x11011000, 0x11011010, 0x11011001, 0x11011011,
        0x11010100, 0x11010110, 0x11010101, 0x11010111,
        0x11011100, 0x11011110, 0x11011101, 0x11011111,
        0x11110000, 0x11110010, 0x11110001, 0x11110011,
        0x11111000, 0x11111010, 0x11111001, 0x11111011,
        0x11110100, 0x11110110, 0x11110101, 0x11110111,
        0x11111100, 0x11111110, 0x11111101, 0x11111111
};

/*
* The final permutation array.  Like the IP array, used
* to compute both the left and right results from the nibbles
* of words computed from:
*
* ((left & 0x0f0f0f0f) << 4) | (right & 0x0f0f0f0f)  for left result
* (left & 0xf0f0f0f0) | ((right & 0xf0f0f0f0) >> 4)  for right result
*
* The result from the high order byte is shifted left 6 bits and
* or'd with the result from the next byte shifted left 4 bits, which
* is or'd with the result from the next byte shifted left 2 bits,
* which is or'd with the result from the low byte.
*
* There is one of these for big end machines (the natural order for
* DES) and a second for little end machines.  One is a byte swapped
* version of the other.
*/
#ifndef XNTP_LITTLE_ENDIAN
        /*
         * Big end version
         */
static u_long FP[256] = {
        0x00000000, 0x02000000, 0x00020000, 0x02020000,
        0x00000200, 0x02000200, 0x00020200, 0x02020200,
        0x00000002, 0x02000002, 0x00020002, 0x02020002,
        0x00000202, 0x02000202, 0x00020202, 0x02020202,
        0x01000000, 0x03000000, 0x01020000, 0x03020000,
        0x01000200, 0x03000200, 0x01020200, 0x03020200,
        0x01000002, 0x03000002, 0x01020002, 0x03020002,
        0x01000202, 0x03000202, 0x01020202, 0x03020202,
        0x00010000, 0x02010000, 0x00030000, 0x02030000,
        0x00010200, 0x02010200, 0x00030200, 0x02030200,
        0x00010002, 0x02010002, 0x00030002, 0x02030002,
        0x00010202, 0x02010202, 0x00030202, 0x02030202,
        0x01010000, 0x03010000, 0x01030000, 0x03030000,
        0x01010200, 0x03010200, 0x01030200, 0x03030200,
        0x01010002, 0x03010002, 0x01030002, 0x03030002,
        0x01010202, 0x03010202, 0x01030202, 0x03030202,
        0x00000100, 0x02000100, 0x00020100, 0x02020100,
        0x00000300, 0x02000300, 0x00020300, 0x02020300,
        0x00000102, 0x02000102, 0x00020102, 0x02020102,
        0x00000302, 0x02000302, 0x00020302, 0x02020302,
        0x01000100, 0x03000100, 0x01020100, 0x03020100,
        0x01000300, 0x03000300, 0x01020300, 0x03020300,
        0x01000102, 0x03000102, 0x01020102, 0x03020102,
        0x01000302, 0x03000302, 0x01020302, 0x03020302,
        0x00010100, 0x02010100, 0x00030100, 0x02030100,
        0x00010300, 0x02010300, 0x00030300, 0x02030300,
        0x00010102, 0x02010102, 0x00030102, 0x02030102,
        0x00010302, 0x02010302, 0x00030302, 0x02030302,
        0x01010100, 0x03010100, 0x01030100, 0x03030100,
        0x01010300, 0x03010300, 0x01030300, 0x03030300,
        0x01010102, 0x03010102, 0x01030102, 0x03030102,
        0x01010302, 0x03010302, 0x01030302, 0x03030302,
        0x00000001, 0x02000001, 0x00020001, 0x02020001,
        0x00000201, 0x02000201, 0x00020201, 0x02020201,
        0x00000003, 0x02000003, 0x00020003, 0x02020003,
        0x00000203, 0x02000203, 0x00020203, 0x02020203,
        0x01000001, 0x03000001, 0x01020001, 0x03020001,
        0x01000201, 0x03000201, 0x01020201, 0x03020201,
        0x01000003, 0x03000003, 0x01020003, 0x03020003,
        0x01000203, 0x03000203, 0x01020203, 0x03020203,
        0x00010001, 0x02010001, 0x00030001, 0x02030001,
        0x00010201, 0x02010201, 0x00030201, 0x02030201,
        0x00010003, 0x02010003, 0x00030003, 0x02030003,
        0x00010203, 0x02010203, 0x00030203, 0x02030203,
        0x01010001, 0x03010001, 0x01030001, 0x03030001,
        0x01010201, 0x03010201, 0x01030201, 0x03030201,
        0x01010003, 0x03010003, 0x01030003, 0x03030003,
        0x01010203, 0x03010203, 0x01030203, 0x03030203,
        0x00000101, 0x02000101, 0x00020101, 0x02020101,
        0x00000301, 0x02000301, 0x00020301, 0x02020301,
        0x00000103, 0x02000103, 0x00020103, 0x02020103,
        0x00000303, 0x02000303, 0x00020303, 0x02020303,
        0x01000101, 0x03000101, 0x01020101, 0x03020101,
        0x01000301, 0x03000301, 0x01020301, 0x03020301,
        0x01000103, 0x03000103, 0x01020103, 0x03020103,
        0x01000303, 0x03000303, 0x01020303, 0x03020303,
        0x00010101, 0x02010101, 0x00030101, 0x02030101,
        0x00010301, 0x02010301, 0x00030301, 0x02030301,
        0x00010103, 0x02010103, 0x00030103, 0x02030103,
        0x00010303, 0x02010303, 0x00030303, 0x02030303,
        0x01010101, 0x03010101, 0x01030101, 0x03030101,
        0x01010301, 0x03010301, 0x01030301, 0x03030301,
        0x01010103, 0x03010103, 0x01030103, 0x03030103,
        0x01010303, 0x03010303, 0x01030303, 0x03030303
};
#else
        /*
         * Byte swapped for little end machines.
         */
static u_long FP[256] = {
        0x00000000, 0x00000002, 0x00000200, 0x00000202,
        0x00020000, 0x00020002, 0x00020200, 0x00020202,
        0x02000000, 0x02000002, 0x02000200, 0x02000202,
        0x02020000, 0x02020002, 0x02020200, 0x02020202,
        0x00000001, 0x00000003, 0x00000201, 0x00000203,
        0x00020001, 0x00020003, 0x00020201, 0x00020203,
        0x02000001, 0x02000003, 0x02000201, 0x02000203,
        0x02020001, 0x02020003, 0x02020201, 0x02020203,
        0x00000100, 0x00000102, 0x00000300, 0x00000302,
        0x00020100, 0x00020102, 0x00020300, 0x00020302,
        0x02000100, 0x02000102, 0x02000300, 0x02000302,
        0x02020100, 0x02020102, 0x02020300, 0x02020302,
        0x00000101, 0x00000103, 0x00000301, 0x00000303,
        0x00020101, 0x00020103, 0x00020301, 0x00020303,
        0x02000101, 0x02000103, 0x02000301, 0x02000303,
        0x02020101, 0x02020103, 0x02020301, 0x02020303,
        0x00010000, 0x00010002, 0x00010200, 0x00010202,
        0x00030000, 0x00030002, 0x00030200, 0x00030202,
        0x02010000, 0x02010002, 0x02010200, 0x02010202,
        0x02030000, 0x02030002, 0x02030200, 0x02030202,
        0x00010001, 0x00010003, 0x00010201, 0x00010203,
        0x00030001, 0x00030003, 0x00030201, 0x00030203,
        0x02010001, 0x02010003, 0x02010201, 0x02010203,
        0x02030001, 0x02030003, 0x02030201, 0x02030203,
        0x00010100, 0x00010102, 0x00010300, 0x00010302,
        0x00030100, 0x00030102, 0x00030300, 0x00030302,
        0x02010100, 0x02010102, 0x02010300, 0x02010302,
        0x02030100, 0x02030102, 0x02030300, 0x02030302,
        0x00010101, 0x00010103, 0x00010301, 0x00010303,
        0x00030101, 0x00030103, 0x00030301, 0x00030303,
        0x02010101, 0x02010103, 0x02010301, 0x02010303,
        0x02030101, 0x02030103, 0x02030301, 0x02030303,
        0x01000000, 0x01000002, 0x01000200, 0x01000202,
        0x01020000, 0x01020002, 0x01020200, 0x01020202,
        0x03000000, 0x03000002, 0x03000200, 0x03000202,
        0x03020000, 0x03020002, 0x03020200, 0x03020202,
        0x01000001, 0x01000003, 0x01000201, 0x01000203,
        0x01020001, 0x01020003, 0x01020201, 0x01020203,
        0x03000001, 0x03000003, 0x03000201, 0x03000203,
        0x03020001, 0x03020003, 0x03020201, 0x03020203,
        0x01000100, 0x01000102, 0x01000300, 0x01000302,
        0x01020100, 0x01020102, 0x01020300, 0x01020302,
        0x03000100, 0x03000102, 0x03000300, 0x03000302,
        0x03020100, 0x03020102, 0x03020300, 0x03020302,
        0x01000101, 0x01000103, 0x01000301, 0x01000303,
        0x01020101, 0x01020103, 0x01020301, 0x01020303,
        0x03000101, 0x03000103, 0x03000301, 0x03000303,
        0x03020101, 0x03020103, 0x03020301, 0x03020303,
        0x01010000, 0x01010002, 0x01010200, 0x01010202,
        0x01030000, 0x01030002, 0x01030200, 0x01030202,
        0x03010000, 0x03010002, 0x03010200, 0x03010202,
        0x03030000, 0x03030002, 0x03030200, 0x03030202,
        0x01010001, 0x01010003, 0x01010201, 0x01010203,
        0x01030001, 0x01030003, 0x01030201, 0x01030203,
        0x03010001, 0x03010003, 0x03010201, 0x03010203,
        0x03030001, 0x03030003, 0x03030201, 0x03030203,
        0x01010100, 0x01010102, 0x01010300, 0x01010302,
        0x01030100, 0x01030102, 0x01030300, 0x01030302,
        0x03010100, 0x03010102, 0x03010300, 0x03010302,
        0x03030100, 0x03030102, 0x03030300, 0x03030302,
        0x01010101, 0x01010103, 0x01010301, 0x01010303,
        0x01030101, 0x01030103, 0x01030301, 0x01030303,
        0x03010101, 0x03010103, 0x03010301, 0x03010303,
        0x03030101, 0x03030103, 0x03030301, 0x03030303
};
#endif

/*
* The SP table is actually the S boxes and the P permutation
* table combined.
*/
static u_long SP[8][64] = {
        0x00808200, 0x00000000, 0x00008000, 0x00808202,
        0x00808002, 0x00008202, 0x00000002, 0x00008000,
        0x00000200, 0x00808200, 0x00808202, 0x00000200,
        0x00800202, 0x00808002, 0x00800000, 0x00000002,
        0x00000202, 0x00800200, 0x00800200, 0x00008200,
        0x00008200, 0x00808000, 0x00808000, 0x00800202,
        0x00008002, 0x00800002, 0x00800002, 0x00008002,
        0x00000000, 0x00000202, 0x00008202, 0x00800000,
        0x00008000, 0x00808202, 0x00000002, 0x00808000,
        0x00808200, 0x00800000, 0x00800000, 0x00000200,
        0x00808002, 0x00008000, 0x00008200, 0x00800002,
        0x00000200, 0x00000002, 0x00800202, 0x00008202,
        0x00808202, 0x00008002, 0x00808000, 0x00800202,
        0x00800002, 0x00000202, 0x00008202, 0x00808200,
        0x00000202, 0x00800200, 0x00800200, 0x00000000,
        0x00008002, 0x00008200, 0x00000000, 0x00808002,

        0x40084010, 0x40004000, 0x00004000, 0x00084010,
        0x00080000, 0x00000010, 0x40080010, 0x40004010,
        0x40000010, 0x40084010, 0x40084000, 0x40000000,
        0x40004000, 0x00080000, 0x00000010, 0x40080010,
        0x00084000, 0x00080010, 0x40004010, 0x00000000,
        0x40000000, 0x00004000, 0x00084010, 0x40080000,
        0x00080010, 0x40000010, 0x00000000, 0x00084000,
        0x00004010, 0x40084000, 0x40080000, 0x00004010,
        0x00000000, 0x00084010, 0x40080010, 0x00080000,
        0x40004010, 0x40080000, 0x40084000, 0x00004000,
        0x40080000, 0x40004000, 0x00000010, 0x40084010,
        0x00084010, 0x00000010, 0x00004000, 0x40000000,
        0x00004010, 0x40084000, 0x00080000, 0x40000010,
        0x00080010, 0x40004010, 0x40000010, 0x00080010,
        0x00084000, 0x00000000, 0x40004000, 0x00004010,
        0x40000000, 0x40080010, 0x40084010, 0x00084000,

        0x00000104, 0x04010100, 0x00000000, 0x04010004,
        0x04000100, 0x00000000, 0x00010104, 0x04000100,
        0x00010004, 0x04000004, 0x04000004, 0x00010000,
        0x04010104, 0x00010004, 0x04010000, 0x00000104,
        0x04000000, 0x00000004, 0x04010100, 0x00000100,
        0x00010100, 0x04010000, 0x04010004, 0x00010104,
        0x04000104, 0x00010100, 0x00010000, 0x04000104,
        0x00000004, 0x04010104, 0x00000100, 0x04000000,
        0x04010100, 0x04000000, 0x00010004, 0x00000104,
        0x00010000, 0x04010100, 0x04000100, 0x00000000,
        0x00000100, 0x00010004, 0x04010104, 0x04000100,
        0x04000004, 0x00000100, 0x00000000, 0x04010004,
        0x04000104, 0x00010000, 0x04000000, 0x04010104,
        0x00000004, 0x00010104, 0x00010100, 0x04000004,
        0x04010000, 0x04000104, 0x00000104, 0x04010000,
        0x00010104, 0x00000004, 0x04010004, 0x00010100,

        0x80401000, 0x80001040, 0x80001040, 0x00000040,
        0x00401040, 0x80400040, 0x80400000, 0x80001000,
        0x00000000, 0x00401000, 0x00401000, 0x80401040,
        0x80000040, 0x00000000, 0x00400040, 0x80400000,
        0x80000000, 0x00001000, 0x00400000, 0x80401000,
        0x00000040, 0x00400000, 0x80001000, 0x00001040,
        0x80400040, 0x80000000, 0x00001040, 0x00400040,
        0x00001000, 0x00401040, 0x80401040, 0x80000040,
        0x00400040, 0x80400000, 0x00401000, 0x80401040,
        0x80000040, 0x00000000, 0x00000000, 0x00401000,
        0x00001040, 0x00400040, 0x80400040, 0x80000000,
        0x80401000, 0x80001040, 0x80001040, 0x00000040,
        0x80401040, 0x80000040, 0x80000000, 0x00001000,
        0x80400000, 0x80001000, 0x00401040, 0x80400040,
        0x80001000, 0x00001040, 0x00400000, 0x80401000,
        0x00000040, 0x00400000, 0x00001000, 0x00401040,

        0x00000080, 0x01040080, 0x01040000, 0x21000080,
        0x00040000, 0x00000080, 0x20000000, 0x01040000,
        0x20040080, 0x00040000, 0x01000080, 0x20040080,
        0x21000080, 0x21040000, 0x00040080, 0x20000000,
        0x01000000, 0x20040000, 0x20040000, 0x00000000,
        0x20000080, 0x21040080, 0x21040080, 0x01000080,
        0x21040000, 0x20000080, 0x00000000, 0x21000000,
        0x01040080, 0x01000000, 0x21000000, 0x00040080,
        0x00040000, 0x21000080, 0x00000080, 0x01000000,
        0x20000000, 0x01040000, 0x21000080, 0x20040080,
        0x01000080, 0x20000000, 0x21040000, 0x01040080,
        0x20040080, 0x00000080, 0x01000000, 0x21040000,
        0x21040080, 0x00040080, 0x21000000, 0x21040080,
        0x01040000, 0x00000000, 0x20040000, 0x21000000,
        0x00040080, 0x01000080, 0x20000080, 0x00040000,
        0x00000000, 0x20040000, 0x01040080, 0x20000080,

        0x10000008, 0x10200000, 0x00002000, 0x10202008,
        0x10200000, 0x00000008, 0x10202008, 0x00200000,
        0x10002000, 0x00202008, 0x00200000, 0x10000008,
        0x00200008, 0x10002000, 0x10000000, 0x00002008,
        0x00000000, 0x00200008, 0x10002008, 0x00002000,
        0x00202000, 0x10002008, 0x00000008, 0x10200008,
        0x10200008, 0x00000000, 0x00202008, 0x10202000,
        0x00002008, 0x00202000, 0x10202000, 0x10000000,
        0x10002000, 0x00000008, 0x10200008, 0x00202000,
        0x10202008, 0x00200000, 0x00002008, 0x10000008,
        0x00200000, 0x10002000, 0x10000000, 0x00002008,
        0x10000008, 0x10202008, 0x00202000, 0x10200000,
        0x00202008, 0x10202000, 0x00000000, 0x10200008,
        0x00000008, 0x00002000, 0x10200000, 0x00202008,
        0x00002000, 0x00200008, 0x10002008, 0x00000000,
        0x10202000, 0x10000000, 0x00200008, 0x10002008,

        0x00100000, 0x02100001, 0x02000401, 0x00000000,
        0x00000400, 0x02000401, 0x00100401, 0x02100400,
        0x02100401, 0x00100000, 0x00000000, 0x02000001,
        0x00000001, 0x02000000, 0x02100001, 0x00000401,
        0x02000400, 0x00100401, 0x00100001, 0x02000400,
        0x02000001, 0x02100000, 0x02100400, 0x00100001,
        0x02100000, 0x00000400, 0x00000401, 0x02100401,
        0x00100400, 0x00000001, 0x02000000, 0x00100400,
        0x02000000, 0x00100400, 0x00100000, 0x02000401,
        0x02000401, 0x02100001, 0x02100001, 0x00000001,
        0x00100001, 0x02000000, 0x02000400, 0x00100000,
        0x02100400, 0x00000401, 0x00100401, 0x02100400,
        0x00000401, 0x02000001, 0x02100401, 0x02100000,
        0x00100400, 0x00000000, 0x00000001, 0x02100401,
        0x00000000, 0x00100401, 0x02100000, 0x00000400,
        0x02000001, 0x02000400, 0x00000400, 0x00100001,

        0x08000820, 0x00000800, 0x00020000, 0x08020820,
        0x08000000, 0x08000820, 0x00000020, 0x08000000,
        0x00020020, 0x08020000, 0x08020820, 0x00020800,
        0x08020800, 0x00020820, 0x00000800, 0x00000020,
        0x08020000, 0x08000020, 0x08000800, 0x00000820,
        0x00020800, 0x00020020, 0x08020020, 0x08020800,
        0x00000820, 0x00000000, 0x00000000, 0x08020020,
        0x08000020, 0x08000800, 0x00020820, 0x00020000,
        0x00020820, 0x00020000, 0x08020800, 0x00000800,
        0x00000020, 0x08020020, 0x00000800, 0x00020820,
        0x08000800, 0x00000020, 0x08000020, 0x08020000,
        0x08020020, 0x08000000, 0x00020000, 0x08000820,
        0x00000000, 0x08020820, 0x00020020, 0x08000020,
        0x08020000, 0x08000800, 0x08000820, 0x00000000,
        0x08020820, 0x00020800, 0x00020800, 0x00000820,
        0x00000820, 0x00020020, 0x08000000, 0x08020800
};

/*
* DESauth_des - perform an in place DES encryption on 64 bits
*
* Note that the `data' argument is always in big-end-first
* byte order, i.e. *(char *)data is the high order byte of
* the 8 byte data word.  We modify the initial and final
* permutation computations for little-end-first machines to
* swap bytes into the natural host order at the beginning and
* back to big-end order at the end.  This is unclean but avoids
* a byte swapping performance penalty on Vaxes (which are slow already).
*/
void
DESauth_des(data, subkeys)
        u_long *data;
        u_char *subkeys;
{
        register u_long left, right;
        register u_long temp;
        register u_char *kp;
        register int i;

        /*
         * Do the initial permutation.  The first operation gets
         * all the bits which are used to form the left half of the
         * permutted result in one word, which is then used to
         * index the appropriate table a byte at a time.
         */
        temp = ((*data & 0x55555555) << 1) | (*(data+1) & 0x55555555);
#ifdef XNTP_LITTLE_ENDIAN
        /*
         * Modify the computation to use the opposite set of bytes.
         */
        left = (IP[(temp >> 24) & 0xff] << 3)
             | (IP[(temp >> 16) & 0xff] << 2)
             | (IP[(temp >>  8) & 0xff] << 1)
             | IP[temp & 0xff];
#else
        left = IP[(temp >> 24) & 0xff]
             | (IP[(temp >> 16) & 0xff] << 1)
             | (IP[(temp >>  8) & 0xff] << 2)
             | (IP[temp & 0xff] << 3);
#endif

        /*
         * Same thing again except for the right half.
         */
        temp = (*data & 0xaaaaaaaa) | ((*(data+1) & 0xaaaaaaaa) >> 1);
#ifdef XNTP_LITTLE_ENDIAN
        right = (IP[(temp >> 24) & 0xff] << 3)
              | (IP[(temp >> 16) & 0xff] << 2)
              | (IP[(temp >>  8) & 0xff] << 1)
              | IP[temp & 0xff];
#else
        right = IP[(temp >> 24) & 0xff]
              | (IP[(temp >> 16) & 0xff] << 1)
              | (IP[(temp >>  8) & 0xff] << 2)
              | (IP[temp & 0xff] << 3);
#endif

        /*
         * Do the 16 rounds through the cipher function.  We actually
         * do two at a time, one on the left half and one on the right
         * half.
         */
        kp = subkeys;
        for (i = 0; i < 8; i++) {
                /*
                 * The E expansion is easy to compute algorithmically.
                 * Take a look at its form and compare it to
                 * everything involving temp below.  Note that
                 * since SP[0-7] don't have any bits in common set
                 * it is okay to do the successive xor's.
                 */
                temp = (right >> 1) | ((right & 1) ? 0x80000000 : 0);
                left ^= SP[0][((temp >> 26) & 0x3f) ^ *kp++];
                left ^= SP[1][((temp >> 22) & 0x3f) ^ *kp++];
                left ^= SP[2][((temp >> 18) & 0x3f) ^ *kp++];
                left ^= SP[3][((temp >> 14) & 0x3f) ^ *kp++];
                left ^= SP[4][((temp >> 10) & 0x3f) ^ *kp++];
                left ^= SP[5][((temp >>  6) & 0x3f) ^ *kp++];
                left ^= SP[6][((temp >>  2) & 0x3f) ^ *kp++];
                left ^= SP[7][(((right << 1) | ((right & 0x80000000)?1:0))
                                & 0x3f) ^ *kp++];

                /*
                 * Careful here.  Right now `right' is actually the
                 * left side and `left' is the right side.  Do the
                 * same thing again, except swap `left' and `right'
                 */
                temp = (left >> 1) | ((left & 1) ? 0x80000000 : 0);
                right ^= SP[0][((temp >> 26) & 0x3f) ^ *kp++];
                right ^= SP[1][((temp >> 22) & 0x3f) ^ *kp++];
                right ^= SP[2][((temp >> 18) & 0x3f) ^ *kp++];
                right ^= SP[3][((temp >> 14) & 0x3f) ^ *kp++];
                right ^= SP[4][((temp >> 10) & 0x3f) ^ *kp++];
                right ^= SP[5][((temp >>  6) & 0x3f) ^ *kp++];
                right ^= SP[6][((temp >>  2) & 0x3f) ^ *kp++];
                right ^= SP[7][(((left << 1) | ((left & 0x80000000)?1:0))
                                & 0x3f) ^ *kp++];

                /*
                 * By the time we get here, all is straightened out
                 * again.  `left' is left and `right' is right.
                 */
        }

        /*
         * Now the final permutation.  Note this is like the IP above
         * except that the data is computed from
         *
         * ((left & 0x0f0f0f0f) << 4) | (right & 0x0f0f0f0f)  for left result
         * (left & 0xf0f0f0f0) | ((right & 0xf0f0f0f0) >> 4)  for right result
         *
         * Just to confuse things more, we're supposed to swap the right
         * and the left halves before doing this.  Instead, we'll just
         * switch which goes where when computing the temporary.
         *
         * This operation also byte swaps stuff back into big end byte
         * order.  This is accomplished by modifying the FP table for
         * little end machines, however, so we don't have to worry about
         * it here.
         */
        temp = ((right & 0x0f0f0f0f) << 4) | (left & 0x0f0f0f0f);
        *data = (FP[(temp >> 24) & 0xff] << 6)
              | (FP[(temp >> 16) & 0xff] << 4)
              | (FP[(temp >>  8) & 0xff] << 2)
              |  FP[temp & 0xff];

        temp = (right & 0xf0f0f0f0) | ((left & 0xf0f0f0f0) >> 4);
        *(data+1) = (FP[(temp >> 24) & 0xff] << 6)
                  | (FP[(temp >> 16) & 0xff] << 4)
                  | (FP[(temp >>  8) & 0xff] << 2)
                  |  FP[temp & 0xff];
};
2004-11-23 21:59
0
雪    币: 240
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看了各位达人的回帖,颇有受益。
但是S-BOX是指硬件实现,在纯算法条件下是S(替代函数)
2004-11-24 20:42
0
雪    币: 205
活跃值: (171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
The Real Design Criteria
After differential cryptanalysis became public, IBM published the design criteria for the S-boxes and the P-box [373,374]. The criteria for the S-boxes are:

― Each S-box has 6 input bits and 4 output bits. (This was the largest size that could be accommodated in a single chip with 1974 technology.)
― No output bit of an S-box should be too close to a linear function of the input bits.
― If you fix the left-most and right-most bits of an S-box and vary the 4 middle bits, each possible 4-bit output is attained exactly once.
― If two inputs to an S-box differ in exactly 1 bit, the outputs must differ in at least 2 bits.
― If two inputs to an S-box differ in the 2 middle bits exactly, the outputs must differ in at least 2 bits.
― If two inputs to an S-box differ in their first 2 bits and are identical in their last 2 bits, the two outputs must not be the same.
― For any nonzero 6-bit difference between inputs, no more than 8 of the 32 pairs of inputs exhibiting that difference may result in the same output difference.
― A criterion similar to the previous one, but for the case of three active S-boxes.
The criteria for the P-box are:

― The 4 output bits from each S-box in round i are distributed so that 2 of them affect the middle-bits of S-boxes at roundi + 1 and the other 2 affect end bits.
― The 4 output bits from each S-box affect six different S-boxes; no 2 affect the same S-box.
― If the output bit from one S-box affects a middle bit of another S-box, then an output bit from that other S-box cannot affect a middle bit of the first S-box.

最初由 shoooo 发布
DES算法的关键就在S盒,只要4轮S盒下来,在Confusion与Deffusion就有了极好的效果.
至今为止,官方始终未公布与证明S盒这样取法的原因,很多人提出质疑,但只要稍微改动S盒一位,强度就大打折扣,实践得出结论,找不到比这个更优的S盒

我曾经在分析某网络游戏时,看到过这样一个算法,表面上看上去与标准的des算法完全无关,但其实质是相同的。对于确定这些比庞大复杂的加密算法,我觉得比较好的办法是找出它们使用的常数与,然后google一下....

........
2004-11-25 13:57
0
游客
登录 | 注册 方可回帖
返回
//