[BACK]Return to des.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / io

Annotation of OpenXM_contrib2/asir2000/io/des.c, Revision 1.1.1.1

1.1       noro        1:  /* $OpenXM: OpenXM/src/asir99/io/des.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */
                      2:  /* Copyright (C) 1996 S.Amada */
                      3:
                      4: #include    <stdio.h>
                      5: #include    <stdlib.h>
                      6:
                      7: #define        ROUND   16  /* 段数 */
                      8:
                      9: typedef    unsigned long   ULONG;
                     10: typedef    unsigned short  USHORT;
                     11: typedef    unsigned char   UCHAR;
                     12:
                     13:
                     14: /*  関数のproto type   */
                     15: void   des_enc(ULONG *, UCHAR *, ULONG *);
                     16: ULONG  round_func(ULONG , UCHAR *);
                     17: ULONG  s_box_func(UCHAR *);
                     18: void   des_dec(ULONG *, UCHAR *, ULONG *);
                     19:
                     20: /*  鍵の縮約型転置 PC-1        */
                     21: static USHORT  pc_1[56] = {
                     22:     56, 48, 40, 32, 24, 16,  8,
                     23:      0, 57, 49, 41, 33, 25, 17,
                     24:      9,  1, 58, 50, 42, 34, 26,
                     25:     18, 10,  2, 59, 51, 43, 35,
                     26:     62, 54, 46, 38, 30, 22, 14,
                     27:      6, 61, 53, 45, 37, 29, 21,
                     28:     13,  5, 60, 52, 44, 36, 28,
                     29:     20, 12,  4, 27, 19, 11,  3
                     30: };
                     31:
                     32: /*  鍵のシフト回数     */
                     33: static USHORT  k_rot[16] = {
                     34:      1,  2,  4,  6,  8, 10, 12, 14,
                     35:     15, 17, 19, 21, 23, 25, 27, 28
                     36: };
                     37:
                     38: /*  鍵の縮約型転置 PC-2        */
                     39: static USHORT  pc_2[48] = {
                     40:     13, 16, 10, 23,  0,  4,
                     41:      2, 27, 14,  5, 20,  9,
                     42:     22, 18, 11,  3, 25,  7,
                     43:     15,  6, 26, 19, 12,  1,
                     44:     40, 51, 30, 36, 46, 54,
                     45:     29, 39, 50, 44, 32, 47,
                     46:     43, 48, 38, 55, 33, 52,
                     47:     45, 41, 49, 35, 28, 31
                     48: };
                     49:
                     50: /*  初期転置(IP)    */
                     51: static USHORT ip_1[64] = {
                     52:     57, 49, 41, 33, 25, 17,  9,  1,
                     53:     59, 51, 43, 35, 27, 19, 11,  3,
                     54:     61, 53, 45, 37, 29, 21, 13,  5,
                     55:     63, 55, 47, 39, 31, 23, 15,  7,
                     56:     56, 48, 40, 32, 24, 16,  8,  0,
                     57:     58, 50, 42, 34, 26, 18, 10,  2,
                     58:     60, 52, 44, 36, 28, 20, 12,  4,
                     59:     62, 54, 46, 38, 30, 22, 14,  6
                     60: };
                     61:
                     62: /*  初期転置(IP^-1) */
                     63: static USHORT  ip_2[64] = {
                     64:     39,  7, 47, 15, 55, 23, 63, 31,
                     65:     38,  6, 46, 14, 54, 22, 62, 30,
                     66:     37,  5, 45, 13, 53, 21, 61, 29,
                     67:     36,  4, 44, 12, 52, 20, 60, 28,
                     68:     35,  3, 43, 11, 51, 19, 59, 27,
                     69:     34,  2, 42, 10, 50, 18, 58, 26,
                     70:     33,  1, 41,  9, 49, 17, 57, 25,
                     71:     32,  0, 40,  8, 48, 16, 56, 24
                     72: };
                     73:
                     74: /* 拡大転置(E) */
                     75: static USHORT f_expand[48] = {
                     76:     31,  0,  1,  2,  3,  4,
                     77:      3,  4,  5,  6,  7,  8,
                     78:      7,  8,  9, 10, 11, 12,
                     79:     11, 12, 13, 14, 15, 16,
                     80:     15, 16, 17, 18, 19, 20,
                     81:     19, 20, 21, 22, 23, 24,
                     82:     23, 24, 25, 26, 27, 28,
                     83:     27, 28, 29, 30, 31,  0
                     84: };
                     85:
                     86: /* S-box    */
                     87: static USHORT s_1[64] = {
                     88:     14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
                     89:      0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
                     90:      4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
                     91:     15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13
                     92: };
                     93:
                     94: static USHORT s_2[64] = {
                     95:     15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
                     96:      3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
                     97:      0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
                     98:     13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9
                     99: };
                    100:
                    101: static USHORT s_3[64] = {
                    102:     10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
                    103:     13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
                    104:     13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
                    105:      1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12
                    106: };
                    107:
                    108: static USHORT s_4[64] = {
                    109:      7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
                    110:     13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
                    111:     10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
                    112:      3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14
                    113: };
                    114:
                    115: static USHORT s_5[64] = {
                    116:      2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
                    117:     14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
                    118:      4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
                    119:     11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3
                    120: };
                    121:
                    122: static USHORT s_6[64] = {
                    123:     12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
                    124:     10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
                    125:      9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
                    126:      4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13
                    127: };
                    128:
                    129: static USHORT s_7[64] = {
                    130:      4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
                    131:     13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
                    132:      1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
                    133:      6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12
                    134: };
                    135:
                    136: static USHORT s_8[64] = {
                    137:     13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
                    138:      1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
                    139:      7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
                    140:      2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
                    141: };
                    142:
                    143: /* 転置(P)  */
                    144: static USHORT f_perm[32] = {
                    145:     15,  6, 19, 20,
                    146:     28, 11, 27, 16,
                    147:      0, 14, 22, 25,
                    148:      4, 17, 30,  9,
                    149:      1,  7, 23, 13,
                    150:     31, 26,  2,  8,
                    151:     18, 12, 29,  5,
                    152:     21, 10,  3, 24
                    153: };
                    154:
                    155:
                    156: /****************************************************************************
                    157:  *                                                                         *
                    158:  *     暗号化関数                                                          *
                    159:  *     void    des_enc(plane,r_key,cipher)                                 *
                    160:  *     ULONG   *plane  : 平文(64 bit)          (input)                     *
                    161:  *     UCHAR   *r_key  : 拡大鍵(48 * 16 bit)   (input)                     *
                    162:  *     ULONG   *cipher : 暗号文(64 bit)        (output)                    *
                    163:  *                                                                         *
                    164:  *     機能    : 平文及び拡大鍵を入力とし、DESのアルゴリズムに基づき暗号文 *
                    165:  *               を生成する。                                              *
                    166:  *     戻り値  : なし                                                      *
                    167:  *                                                                         *
                    168:  ****************************************************************************/
                    169: void   des_enc(plane,r_key,cipher)
                    170: ULONG  *plane;     /* 平文(64 bit)             */
                    171: UCHAR  *r_key;     /* 拡大鍵(48 * 16 bit)      */
                    172: ULONG  *cipher;    /* 暗号文(64 bit)           */
                    173: {
                    174:     ULONG   l_text,r_text,
                    175:            l_work,r_work,tmp_text,c_text[2];
                    176:     int            loop;
                    177:
                    178:
                    179:     l_text = *plane;
                    180:     r_text = *(plane+1);
                    181:
                    182: /* 初期転置(IP)        */
                    183:     l_work = 0x00000000L;
                    184:     r_work = 0x00000000L;
                    185:     for(loop = 0;loop < 64;loop++)
                    186:     {
                    187:        if(loop < 32)
                    188:        {
                    189:            if(ip_1[loop] < 32)
                    190:            {
                    191:                if(l_text & (0x80000000L >> ip_1[loop]))
                    192:                    l_work |= 0x80000000L >> loop;
                    193:            }
                    194:            else
                    195:            {
                    196:                if(r_text & (0x80000000L >> (ip_1[loop] - 32)))
                    197:                    l_work |= 0x80000000L >> loop;
                    198:            }
                    199:        }
                    200:        else
                    201:        {
                    202:            if(ip_1[loop] < 32)
                    203:            {
                    204:                if(l_text & (0x80000000L >> ip_1[loop]))
                    205:                    r_work |= 0x80000000L >> (loop - 32);
                    206:            }
                    207:            else
                    208:            {
                    209:                if(r_text & (0x80000000L >> (ip_1[loop] - 32)))
                    210:                    r_work |= 0x80000000L >> (loop - 32);
                    211:            }
                    212:        }
                    213:     }
                    214:     l_text = l_work;
                    215:     r_text = r_work;
                    216:
                    217: #ifdef DEBUG
                    218: printf("l_text: %08x,r_text: %08x.\n",l_text,r_text);
                    219: #endif
                    220:
                    221: /* 段関数 f(R,K)    */
                    222:     for(loop = 0;loop < ROUND;loop++,r_key+=6)
                    223:     {
                    224:        tmp_text = l_text;
                    225:        l_text = r_text;
                    226:        r_text = (ULONG)tmp_text ^ (ULONG)round_func(r_text,r_key);
                    227: #ifdef DEBUG
                    228: printf("round[%d] l_text: %08x, r_text: %08x.\n",loop,l_text,r_text);
                    229: #endif
                    230:     }
                    231:     tmp_text = l_text;
                    232:     l_text = r_text;
                    233:     r_text = tmp_text;
                    234:
                    235: /* 最終転置(IP^-1)  */
                    236:     l_work = 0x00000000L;
                    237:     r_work = 0x00000000L;
                    238:     for(loop = 0;loop < 64;loop++)
                    239:     {
                    240:        if(loop < 32)
                    241:        {
                    242:            if(ip_2[loop] < 32)
                    243:            {
                    244:                if(l_text & (0x80000000L >> ip_2[loop]))
                    245:                    l_work |= 0x80000000L >> loop;
                    246:            }
                    247:            else
                    248:            {
                    249:                if(r_text & (0x80000000L >> (ip_2[loop] - 32)))
                    250:                    l_work |= 0x80000000L >> loop;
                    251:            }
                    252:        }
                    253:        else
                    254:        {
                    255:            if(ip_2[loop] < 32)
                    256:            {
                    257:                if(l_text & (0x80000000L >> ip_2[loop]))
                    258:                    r_work |= 0x80000000L >> (loop - 32);
                    259:            }
                    260:            else
                    261:            {
                    262:                if(r_text & (0x80000000L >> (ip_2[loop] - 32)))
                    263:                    r_work |= 0x80000000L >> (loop - 32);
                    264:            }
                    265:        }
                    266:     }
                    267:     /*l_text = l_work;
                    268:     r_text = r_work;*/
                    269:
                    270: #ifdef DEBUG
                    271: printf("l_text: %08x,r_text: %08x.\n",l_text,r_text);
                    272: #endif
                    273:
                    274:     *cipher = l_work;
                    275:     *(cipher+1) = r_work;
                    276:
                    277:     return;
                    278: }
                    279:
                    280:
                    281: /****************************************************************************
                    282:  *                                                                         *
                    283:  *     段関数(f(R,K)                                                       *
                    284:  *     ULONG   round_func(text,key)                                        *
                    285:  *     ULONG   text    : 入力文(32 bit)        (input)                     *
                    286:  *     UCHAR   *key    : 拡大鍵(48 bit)        (input)                     *
                    287:  *                                                                         *
                    288:  *     機能    : 入力文及び拡大鍵を入力とし、DESの段関数の出力を返す。     *
                    289:  *     戻り値  : 段関数(f(R,K))の出力値                                    *
                    290:  *                                                                         *
                    291:  ****************************************************************************/
                    292: ULONG  round_func(text,key)
                    293: ULONG  text;
                    294: UCHAR  *key;
                    295: {
                    296:     UCHAR   e_val[6],k_work[6];
                    297:     ULONG   t_work,t_val;
                    298:     int            loop;
                    299:
                    300:
                    301:     t_work = text;
                    302:
                    303: /* 拡大転置(E) 32bit(4byte) -> 48bit(6byte)            */
                    304:     memset(e_val,0x00L,6);
                    305:     for(loop = 0;loop < 48;loop++)
                    306:        if(t_work & (0x80000000L >> f_expand[loop]))
                    307:            e_val[loop / 8] |= 0x80L >> (loop % 8);
                    308:
                    309: #ifdef DEBUG
                    310: printf("Expand: %02x%02x%02x%02x%02x%02x.\n",
                    311:     e_val[0],e_val[1],e_val[2],e_val[3],e_val[4],e_val[5]);
                    312: #endif
                    313:
                    314: /* 鍵との排他的論理和演算 48bit(6byte) -> 48bit(6byte) */
                    315:     memset(k_work,0x00L,6);
                    316:     for(loop = 0;loop < 6;loop++,key++)
                    317:        k_work[loop] = e_val[loop] ^ *key;
                    318:
                    319: #ifdef DEBUG
                    320: printf("Key EXORed: %02x%02x%02x%02x%02x%02x.\n",
                    321:     k_work[0],k_work[1],k_work[2],k_work[3],k_work[4],k_work[5]);
                    322: #endif
                    323:
                    324: /* S-box 48bit(6byte) -> 32bit(4byte)                  */
                    325:     t_work = s_box_func(k_work);
                    326:
                    327: #ifdef DEBUG
                    328: printf("s-box value: %08x.\n",t_work);
                    329: #endif
                    330:
                    331: /* 転置(P) 32bit(4byte) -> 32bit(4byte)                        */
                    332:     t_val = 0x00000000L;
                    333:     for(loop = 0;loop < 32;loop++)
                    334:        if(t_work & (0x80000000L >> f_perm[loop]))
                    335:            t_val |= 0x80000000L >> loop;
                    336:
                    337: #ifdef DEBUG
                    338: printf("Round func value: %08x.\n",t_val);
                    339: #endif
                    340:
                    341:     return(t_val);
                    342: }
                    343:
                    344:
                    345: /****************************************************************************
                    346:  *                                                                         *
                    347:  *     段関数(f(R,K)                                                       *
                    348:  *     ULONG   s_box_func(i_data)                                          *
                    349:  *     UCHAR   *i_data : 入力文(48 bit)        (input)                     *
                    350:  *                                                                         *
                    351:  *     機能    : 入力文を入力とし、DESのS-Boxの出力値(32 bit)を返す。      *
                    352:  *     戻り値  : S-Boxの出力値                                             *
                    353:  *                                                                         *
                    354:  ****************************************************************************/
                    355: ULONG  s_box_func(i_data)
                    356: UCHAR  *i_data;
                    357: {
                    358:     int            loop;
                    359:     UCHAR   work[6],s_work[8],val;
                    360:     ULONG   fval;
                    361:
                    362:
                    363:     for(loop = 0;loop < 6;loop++,i_data++) work[loop] = *i_data;
                    364:
                    365: /* S1 */
                    366:     s_work[0] = (work[0] >> 2) & 0x3fL;
                    367:     val = (s_work[0] >> 1) & 0x0fL;
                    368:     if(s_work[0] & 0x20L)
                    369:     {
                    370:        if(s_work[0] & 0x01L) s_work[0] = s_1[val+48];
                    371:        else s_work[0] = s_1[val+32];
                    372:     }
                    373:     else
                    374:     {
                    375:        if(s_work[0] & 0x01L) s_work[0] = s_1[val+16];
                    376:        else s_work[0] = s_1[val];
                    377:     }
                    378:
                    379: /* S2 */
                    380:     s_work[1] = ((work[0] << 4) | (work[1] >> 4)) & 0x3fL;
                    381:     val = (s_work[1] >> 1) & 0x0fL;
                    382:     if(s_work[1] & 0x20L)
                    383:     {
                    384:        if(s_work[1] & 0x01L) s_work[1] = s_2[val+48];
                    385:        else s_work[1] = s_2[val+32];
                    386:     }
                    387:     else
                    388:     {
                    389:        if(s_work[1] & 0x01L) s_work[1] = s_2[val+16];
                    390:        else s_work[1] = s_2[val];
                    391:     }
                    392:
                    393: /* S3 */
                    394:     s_work[2] = ((work[1] << 2) | (work[2] >> 6)) & 0x3fL;
                    395:     val = (s_work[2] >> 1) & 0x0fL;
                    396:     if(s_work[2] & 0x20L)
                    397:     {
                    398:        if(s_work[2] & 0x01L) s_work[2] = s_3[val+48];
                    399:        else s_work[2] = s_3[val+32];
                    400:     }
                    401:     else
                    402:     {
                    403:        if(s_work[2] & 0x01L) s_work[2] = s_3[val+16];
                    404:        else s_work[2] = s_3[val];
                    405:     }
                    406:
                    407: /* S4 */
                    408:     s_work[3] = work[2] & 0x3fL;
                    409:     val = (s_work[3] >> 1) & 0x0fL;
                    410:     if(s_work[3] & 0x20L)
                    411:     {
                    412:        if(s_work[3] & 0x01L) s_work[3] = s_4[val+48];
                    413:        else s_work[3] = s_4[val+32];
                    414:     }
                    415:     else
                    416:     {
                    417:        if(s_work[3] & 0x01L) s_work[3] = s_4[val+16];
                    418:        else s_work[3] = s_4[val];
                    419:     }
                    420:
                    421: /* S5 */
                    422:     s_work[4] = (work[3] >> 2) & 0x3fL;
                    423:     val = (s_work[4] >> 1) & 0x0fL;
                    424:     if(s_work[4] & 0x20L)
                    425:     {
                    426:        if(s_work[4] & 0x01L) s_work[4] = s_5[val+48];
                    427:        else s_work[4] = s_5[val+32];
                    428:     }
                    429:     else
                    430:     {
                    431:        if(s_work[4] & 0x01L) s_work[4] = s_5[val+16];
                    432:        else s_work[4] = s_5[val];
                    433:     }
                    434:
                    435: /* S6 */
                    436:     s_work[5] = ((work[3] << 4) | (work[4] >> 4)) & 0x3fL;
                    437:     val = (s_work[5] >> 1) & 0x0fL;
                    438:     if(s_work[5] & 0x20L)
                    439:     {
                    440:        if(s_work[5] & 0x01L) s_work[5] = s_6[val+48];
                    441:        else s_work[5] = s_6[val+32];
                    442:     }
                    443:     else
                    444:     {
                    445:        if(s_work[5] & 0x01L) s_work[5] = s_6[val+16];
                    446:        else s_work[5] = s_6[val];
                    447:     }
                    448:
                    449: /* S7 */
                    450:     s_work[6] = ((work[4] << 2) | (work[5] >> 6)) & 0x3fL;
                    451:     val = (s_work[6] >> 1) & 0x0fL;
                    452:     if(s_work[6] & 0x20L)
                    453:     {
                    454:        if(s_work[6] & 0x01L) s_work[6] = s_7[val+48];
                    455:        else s_work[6] = s_7[val+32];
                    456:     }
                    457:     else
                    458:     {
                    459:        if(s_work[6] & 0x01L) s_work[6] = s_7[val+16];
                    460:        else s_work[6] = s_7[val];
                    461:     }
                    462:
                    463: /* S8 */
                    464:     s_work[7] = work[5] & 0x3fL;
                    465:     val = (s_work[7] >> 1) & 0x0fL;
                    466:     if(s_work[7] & 0x20L)
                    467:     {
                    468:        if(s_work[7] & 0x01L) s_work[7] = s_8[val+48];
                    469:        else s_work[7] = s_8[val+32];
                    470:     }
                    471:     else
                    472:     {
                    473:        if(s_work[7] & 0x01L) s_work[7] = s_8[val+16];
                    474:        else s_work[7] = s_8[val];
                    475:     }
                    476:
                    477:     fval = (s_work[0] << 28) | (s_work[1] << 24)
                    478:            | (s_work[2] << 20) | (s_work[3] << 16)
                    479:            | (s_work[4] << 12) | (s_work[5] << 8)
                    480:            | (s_work[6] << 4)  | s_work[7];
                    481:
                    482:     return(fval);
                    483: }
                    484:
                    485:
                    486: /****************************************************************************
                    487:  *                                                                         *
                    488:  *     復号関数                                                            *
                    489:  *     void    des_dec(cipher,r_key,plane)                                 *
                    490:  *     ULONG   *cipher : 暗号文(64 bit)        (output)                    *
                    491:  *     UCHAR   *r_key  : 拡大鍵(48 * 16 bit)   (input)                     *
                    492:  *     ULONG   *plane  : 平文(64 bit)          (input)                     *
                    493:  *                                                                         *
                    494:  *     機能    : 暗号文及び拡大鍵を入力とし、DESのアルゴリズムに基づき平文 *
                    495:  *               を生成する。                                              *
                    496:  *     戻り値  : なし                                                      *
                    497:  *                                                                         *
                    498:  ****************************************************************************/
                    499: void   des_dec(cipher,r_key,plane)
                    500: ULONG  *cipher;
                    501: UCHAR  *r_key;
                    502: ULONG  *plane;
                    503: {
                    504:     ULONG   l_text,r_text,
                    505:            l_work,r_work,tmp_text;
                    506:     UCHAR   *tmp_k;
                    507:     int            loop;
                    508:
                    509:
                    510:     l_text = *cipher;
                    511:     r_text = *(cipher+1);
                    512:
                    513:
                    514: /* 初期転置(IP)        */
                    515:     l_work = 0x00000000L;
                    516:     r_work = 0x00000000l;
                    517:     for(loop = 0;loop < 64;loop++)
                    518:     {
                    519:        if(loop < 32)
                    520:        {
                    521:            if(ip_1[loop] < 32)
                    522:            {
                    523:                if(l_text & (0x80000000L >> ip_1[loop]))
                    524:                    l_work |= 0x80000000L >> loop;
                    525:            }
                    526:            else
                    527:            {
                    528:                if(r_text & (0x80000000L >> (ip_1[loop] - 32)))
                    529:                    l_work |= 0x80000000L >> loop;
                    530:            }
                    531:        }
                    532:        else
                    533:        {
                    534:            if(ip_1[loop] < 32)
                    535:            {
                    536:                if(l_text & (0x80000000L >> ip_1[loop]))
                    537:                    r_work |= 0x80000000l >> (loop - 32);
                    538:            }
                    539:            else
                    540:            {
                    541:                if(r_text & (0x80000000L >> (ip_1[loop] - 32)))
                    542:                    r_work |= 0x80000000L >> (loop - 32);
                    543:            }
                    544:        }
                    545:     }
                    546:     l_text = l_work;
                    547:     r_text = r_work;
                    548:
                    549: /* 段関数 f(R,K)    */
                    550:     tmp_k = r_key+90;
                    551:     for(loop = 0;loop < ROUND;loop++,tmp_k-=6)
                    552:     {
                    553:        tmp_text = l_text;
                    554:        l_text = r_text;
                    555:        r_text = tmp_text ^ round_func(r_text,tmp_k);
                    556:
                    557: #ifdef DEBUG
                    558: printf("round[%d] l_text: %08x, r_text: %08x.\n",loop,l_text,r_text);
                    559: #endif
                    560:
                    561:     }
                    562:     tmp_text = l_text;
                    563:     l_text = r_text;
                    564:     r_text = tmp_text;
                    565:
                    566: /* 最終転置(IP^-1)  */
                    567:     l_work = 0x00000000L;
                    568:     r_work = 0x00000000L;
                    569:     for(loop = 0;loop < 64;loop++)
                    570:     {
                    571:        if(loop < 32)
                    572:        {
                    573:            if(ip_2[loop] < 32)
                    574:            {
                    575:                if(l_text & (0x80000000L >> ip_2[loop]))
                    576:                    l_work |= 0x80000000L >> loop;
                    577:            }
                    578:            else
                    579:            {
                    580:                if(r_text & (0x80000000L >> (ip_2[loop] - 32)))
                    581:                    l_work |= 0x80000000L >> loop;
                    582:            }
                    583:        }
                    584:        else
                    585:        {
                    586:            if(ip_2[loop] < 32)
                    587:            {
                    588:                if(l_text & (0x80000000L >> ip_2[loop]))
                    589:                    r_work |= 0x80000000L >> (loop - 32);
                    590:            }
                    591:            else
                    592:            {
                    593:                if(r_text & (0x80000000L >> (ip_2[loop] - 32)))
                    594:                    r_work |= 0x80000000L >> (loop - 32);
                    595:            }
                    596:        }
                    597:     }
                    598:     l_text = l_work;
                    599:     r_text = r_work;
                    600:
                    601:     *plane = l_text;
                    602:     *(plane+1) = r_text;
                    603:
                    604:     return;
                    605: }
                    606:
                    607:
                    608: /****************************************************************************
                    609:  *                                                                         *
                    610:  *     鍵スケジュール関数                                                  *
                    611:  *     void    key_schedule(key)                                           *
                    612:  *     UCHAR   *key    : 暗号化鍵(64 bit)      (input)                     *
                    613:  *                                                                         *
                    614:  *     機能    : 暗号化鍵を入力とし、DESの鍵スケジュールアルゴリズムに基づ *
                    615:  *               き段毎の拡大鍵を生成し、大域変数(EX_KEY[96])に格納する。  *
                    616:  *     戻り値  : なし                                                      *
                    617:  *                                                                         *
                    618:  ****************************************************************************/
                    619: void   key_schedule(key,ex_key)
                    620: UCHAR  *key,*ex_key;
                    621: {
                    622:     UCHAR   r_key[6],*k_p;
                    623:     ULONG   k_work1,k_work2,
                    624:            c_key,d_key,
                    625:            c_tmp,d_tmp;
                    626:     int            loop,loop2,len,strcnt;
                    627:
                    628:
                    629:     k_work1 = 0x00000000L;
                    630:     k_work2 = 0x00000000L;
                    631:     k_work1 |= ((ULONG)*key << 24) | ((ULONG)*(key+1) << 16)
                    632:            | ((ULONG)*(key+2) << 8) | (ULONG)*(key+3);
                    633:     k_work2 |= ((ULONG)*(key+4) << 24) | ((ULONG)*(key+5) << 16)
                    634:            | ((ULONG)*(key+6) << 8) | (ULONG)*(key+7);
                    635:
                    636: /* 鍵の縮約転置(PC-1)  */
                    637:     c_key = 0x00000000L;
                    638:     d_key = 0x00000000L;
                    639:     for(loop = 0;loop < 56;loop++)
                    640:     {
                    641:        if(loop < 28)
                    642:        {
                    643:            if(pc_1[loop] < 32)
                    644:            {
                    645:                if(k_work1 & (0x80000000L >> pc_1[loop]))
                    646:                    c_key |= 0x80000000L >> loop;
                    647:            }
                    648:            else
                    649:            {
                    650:                if(k_work2 & (0x80000000L >> pc_1[loop] - 32))
                    651:                    c_key |= 0x80000000L >> loop;
                    652:            }
                    653:        }
                    654:        else
                    655:        {
                    656:            if(pc_1[loop] < 32)
                    657:            {
                    658:                if(k_work1 & (0x80000000L >> pc_1[loop]))
                    659:                    d_key |= 0x80000000L >> (loop - 28);
                    660:            }
                    661:            else
                    662:            {
                    663:                if(k_work2 & (0x80000000L >> pc_1[loop] - 32))
                    664:                    d_key |= 0x80000000L >> (loop - 28);
                    665:            }
                    666:        }
                    667:     }
                    668:
                    669: #ifdef DEBUG
                    670: printf("c: %08x,d: %08x.\n",c_key,d_key);
                    671: #endif
                    672:
                    673:     k_p = ex_key;
                    674:     for(loop = 0;loop < 16;loop++,k_p+=6)
                    675:     {
                    676: /* 鍵のシフト      */
                    677:        c_tmp = 0x00000000L;
                    678:        d_tmp = 0x00000000L;
                    679:        c_tmp = (c_key << k_rot[loop]) | (c_key >> (28-k_rot[loop]));
                    680:        d_tmp = (d_key << k_rot[loop]) | (d_key >> (28-k_rot[loop]));
                    681:
                    682: /* 鍵の縮約型転置(PC-2)        */
                    683:        memset(r_key,0x00L,6);
                    684:        for(loop2 = 0;loop2 < 48;loop2++)
                    685:        {
                    686:            if(pc_2[loop2] < 28)
                    687:            {
                    688:                if(c_tmp & (0x80000000L >> pc_2[loop2]))
                    689:                    r_key[loop2 / 8] |= 0x80 >> (loop2 % 8);
                    690:            }
                    691:            else
                    692:            {
                    693:                if(d_tmp & (0x80000000L >> pc_2[loop2]-28))
                    694:                    r_key[loop2 / 8] |= (0x80 >> (loop2 % 8));
                    695:            }
                    696:        }
                    697:
                    698:        memcpy(k_p,r_key,6);
                    699:
                    700: #ifdef DEBUG
                    701: printf("key[%d]: %02x %02x %02x %02x %02x %02x\n",
                    702:     loop,r_key[0],r_key[1],r_key[2],r_key[3],r_key[4],r_key[5]) ;
                    703: #endif
                    704:     }
                    705: }
                    706:
                    707: #if 0
                    708: /* 動作確認用main   */
                    709: void   main(void)
                    710: {
                    711:     ULONG   p_text[2],c_text[2];
                    712:     UCHAR   key[8] =
                    713:            /*{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};*/
                    714:            /*{ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};*/
                    715:            { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
                    716:            /*{ 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};*/
                    717:            /*{ 0x03,0x96,0x49,0xc5,0x39,0x31,0x39,0x65};*/
                    718:     int            loop;
                    719:
                    720:
                    721:     /*p_text[0] = 0x00000000;
                    722:     p_text[1] = 0x00000000;*/
                    723:     p_text[0] = 0x01234567L;
                    724:     p_text[1] = 0x89abcde7L;
                    725:     /*p_text[0] = 0xffffffff;
                    726:     p_text[1] = 0xffffffff;*/
                    727:
                    728:     /*printf("plane: %08x%08x.\n",p_text[0],p_text[1]);*/
                    729:
                    730:
                    731:     for(loop =0;loop < 1024*10;loop++)
                    732:     {
                    733:        key_schedule(key);
                    734:        des_enc(p_text,EX_KEY,c_text);
                    735:        /*printf("cipher: %08x%08x.\n\n",c_text[0],c_text[1]);*/
                    736:
                    737:        /*p_text[0] = c_text[0];
                    738:        p_text[1] = c_text[1];*/
                    739:     }
                    740:
                    741:     /*des_dec(c_text,EX_KEY,p_text);
                    742:     printf("plane: %08x%08x.\n",p_text[0],p_text[1]);*/
                    743:
                    744: }
                    745: #endif
                    746:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>