代码据说出自于Richard Outerbridge ,搜索一下都可以找到,在文档中,我知道pc1表是用来转换密钥的,而且密钥应该是64位的,但是在下面的代码里面,
                     l = pc1[j];
        m = l & 07;
        pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;

用到pc1表的只有这个地方,而且赋值后的pc1m的值只有0和1,而且,这个Key好像只用到了0-7位?不是64位的么?这个bytebit在这里又做什么用的呢?
请各位高手指点
[code=c]
#define EN0    0    /* MODE == encrypt */
#define DE1    1    /* MODE == decrypt */


const static unsigned short bytebit[8]    = {
    0200, 0100, 040, 020, 010, 04, 02, 01 };

const static unsigned char pc1[56] = {
    56, 48, 40, 32, 24, 16,  8,     0, 57, 49, 41, 33, 25, 17,
     9,  1, 58, 50, 42, 34, 26,    18, 10,  2, 59, 51, 43, 35,
    62, 54, 46, 38, 30, 22, 14,     6, 61, 53, 45, 37, 29, 21,
    13,  5, 60, 52, 44, 36, 28,    20, 12,  4, 27, 19, 11,  3 };
const static unsigned char totrot[16] = {
    1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };

const static unsigned char pc2[48] = {
    13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9,
    22, 18, 11,  3, 25,  7, 15,  6, 26, 19, 12,  1,
    40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
    43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
void deskey(unsigned char *key,short edf)    /* Thanks to James Gillogly & Phil Karn! */
{
    int i, j, l, m, n;
    unsigned char pc1m[56], pcr[56];
    unsigned long kn[32];

    for ( j = 0; j < 56; j++ ) {
        l = pc1[j];
        m = l & 07;
        pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
        }
    for( i = 0; i < 16; i++ ) {
        if( edf == DE1 ) m = (15 - i) << 1;
        else m = i << 1;
        n = m + 1;
        kn[m] = kn[n] = 0L;
        for( j = 0; j < 28; j++ ) {
            l = j + totrot[i];
            if( l < 28 ) pcr[j] = pc1m[l];
            else pcr[j] = pc1m[l - 28];
            }
        for( j = 28; j < 56; j++ ) {
            l = j + totrot[i];
            if( l < 56 ) pcr[j] = pc1m[l];
            else pcr[j] = pc1m[l - 28];
            }
        for( j = 0; j < 24; j++ ) {
            if( pcr[pc2[j]] ) kn[m] |= (0x800000L >> j);
            if( pcr[pc2[j+24]] ) kn[n] |= (0x800000L >> j);
            }
        }
    cookey(kn);
    return;
    }
[/code][em18][em18]