📄 des.lst
字号:
283 {0x03,0x10}, /* 37 */
284 {0x00,0x00},
285 {0x04,0x02}, /* 39 */
286 {0x03,0x01}, /* 40 */
287
288 {0x03,0x80}, /* 41 */
289 {0x05,0x10}, /* 42 */
290 {0x00,0x00},
291 {0x04,0x08}, /* 44 */
292 {0x04,0x40}, /* 45 */
293 {0x05,0x20}, /* 46 */
294 {0x03,0x80}, /* 47 */
295 {0x04,0x10}, /* 48 */
296
297 {0x04,0x04}, /* 49 */
298 {0x05,0x08}, /* 50 */
299 {0x04,0x80}, /* 51 */
300 {0x03,0x40}, /* 52 */
301 {0x05,0x40}, /* 53 */
302 {0x00,0x00},
303 {0x03,0x04}, /* 55 */
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 6
304 {0x04,0x01} /* 56 */
305 };
306
307 /*
308 * 56位的密码经过分组循环后,重新组成56位密码,然后通过压缩变换获得48位的
309 * 压缩置换密码,本函数目的就是为获得此压缩的48位密码,以便与通过S盒获得的
310 * 数进行"OR" 运算
311 */
312 void Key_56_To_48(unsigned char Key_56[],unsigned char Key_48[]) {
313 1 unsigned char i,j,deal_data;
314 1 unsigned char index=0;
315 1 unsigned char NewKey_index,NewKey_data;
316 1
317 1 for (i=0;i<6;i++)
318 1 Key_48[i]=0;
319 1 for (i=0;i<7;i++) {
320 2 deal_data=Key_56[i];
321 2 for (j=0;j<8;j++) {
322 3 if ((deal_data & 0x80)==0x80) {
323 4 NewKey_index=Key_56_To_48_Tab[index][0];
324 4 NewKey_data=Key_56_To_48_Tab[index][1];
325 4 Key_48[NewKey_index] |= NewKey_data;
326 4 }
327 3 index++;
328 3 deal_data <<= 1;
329 3 }
330 2 }
331 1 }
332
333 unsigned char *SBox_Tab[]={
334 SBox_1,
335 SBox_2,
336 SBox_3,
337 SBox_4,
338 SBox_5,
339 SBox_6,
340 SBox_7,
341 SBox_8
342 };
343
344 /*
345 * 48-bits 输进S-盒,获得32-bits的输出
346 * 输出结果仍旧放进data[]
347 */
348 extern void S_Box_Replace(unsigned char in_data[]) {
349 1 unsigned char out_data[8],temp_data;
350 1 unsigned char *ptr;
351 1 char i,j,k;
352 1
353 1 for (i=0;i<8;i++) { /* 分别处理8个S-盒*/
354 2 temp_data=(in_data[0]>>2);
355 2 temp_data &= 0x3f; /* 获得即将去查表的索引值 */
356 2 for (j=0;j<6;j++) { /* 准备向左循环6次 */
357 3 for (k=0;k<5;k++) { /* 每次循环6个bytes都要动 */
358 4 in_data[k]<<=1;
359 4 in_data[k]|=((in_data[k+1]>>7) & 0x01);
360 4 }
361 3 in_data[5]<<=1; /* 最后一个字节与前面的操作有区别*/
362 3 }
363 2 ptr=(unsigned char *)&SBox_Tab[i][0];
364 2 //*ptr=(unsigned char *)SBox_Tab[i]; /* 指向第i个S-盒的转换表*/
365 2 //out_data[i]=(*ptr)[temp_data]; /* 获得转换数据 */
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 7
366 2 out_data[i]=(ptr)[temp_data]; /* 获得转换数据 */
367 2 }
368 1 for (i=0;i<4;i++) {
369 2 in_data[i]=( (out_data[2*i]<<4) | out_data[2*i+1]);
370 2 }
371 1 }
372
373 /*
374 // 0 32 01 02 03 04 05 04 05
375 // 1 06 07 08 09 08 09 10 11
376 // 2 12 13 12 13 14 15 16 17
377 // 3 16 17 18 19 20 21 20 21
378 // 4 22 23 24 25 24 25 26 27
379 // 5 28 29 28 29 30 31 32 01
380 * ------------------------------------
381 * 01分别在第0行及第5行存在,第0行的最后要和0x40或,第5行的最后要和0x01或
382 */
383 static unsigned char Data_32_To_48_Tab[32][4]={
384 {0x00,0x40,0x05,0x01}, /* 1 */
385 {0x00,0x20,0x00,0x00}, /* 2 */
386 {0x00,0x10,0x00,0x00}, /* 3 */
387 {0x00,0x08,0x00,0x02}, /* 4 */
388 {0x00,0x04,0x00,0x01}, /* 5 */
389 {0x01,0x80,0x00,0x00}, /* 6 */
390 {0x01,0x40,0x00,0x00}, /* 7 */
391 {0x01,0x20,0x01,0x08}, /* 8 */
392
393 {0x01,0x10,0x01,0x04}, /* 9 */
394 {0x01,0x02,0x00,0x00}, /* 10 */
395 {0x01,0x01,0x00,0x00}, /* 11 */
396 {0x02,0x80,0x02,0x20}, /* 12 */
397 {0x02,0x40,0x02,0x10}, /* 13 */
398 {0x02,0x08,0x00,0x00}, /* 14 */
399 {0x02,0x04,0x00,0x00}, /* 15 */
400 {0x02,0x02,0x03,0x80}, /* 16 */
401
402 {0x02,0x01,0x03,0x40}, /* 17 */
403 {0x03,0x20,0x00,0x00}, /* 18 */
404 {0x03,0x10,0x00,0x00}, /* 19 */
405 {0x03,0x08,0x03,0x02}, /* 20 */
406 {0x03,0x04,0x03,0x01}, /* 21 */
407 {0x04,0x80,0x00,0x00}, /* 22 */
408 {0x04,0x40,0x00,0x00}, /* 23 */
409 {0x04,0x20,0x04,0x08}, /* 24 */
410
411 {0x04,0x10,0x04,0x04}, /* 25 */
412 {0x04,0x02,0x00,0x00}, /* 26 */
413 {0x04,0x01,0x00,0x00}, /* 27 */
414 {0x05,0x80,0x05,0x20}, /* 28 */
415 {0x05,0x40,0x05,0x10}, /* 29 */
416 {0x05,0x08,0x00,0x00}, /* 30 */
417 {0x05,0x04,0x00,0x00}, /* 31 */
418 {0x05,0x02,0x00,0x80} /* 32 */
419 };
420 /*
421 * 将32-bits的数据扩展成48-bits的数据位准备与48-bits的密码异或
422 * 本函数正是为了扩展的目的 : 32-bits ==> 48-bits
423 * input : Plain_32[4]
424 * output : Plain_48[6]
425 */
426 void Data_32_To_48(unsigned char Plain_32[],unsigned char Plain_48[]){
427 1 unsigned char i,j,deal_data;
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 8
428 1 unsigned char index=0;
429 1 unsigned char NewKey_index,NewKey_data;
430 1
431 1 for (i=0;i<6;i++) /* 6个字节作为输出*/
432 1 Plain_48[i]=0;
433 1 for (i=0;i<4;i++) { /* 总共4字节, 4*8=32 */
434 2 deal_data=Plain_32[i]; /* 取第i个字节 */
435 2 for (j=0;j<8;j++) {
436 3 if ((deal_data & 0x80)==0x80) {
437 4 NewKey_index=Data_32_To_48_Tab[index][0];
438 4 NewKey_data=Data_32_To_48_Tab[index][1];
439 4 Plain_48[NewKey_index] |= NewKey_data;
440 4
441 4 NewKey_index=Data_32_To_48_Tab[index][2];
442 4 NewKey_data=Data_32_To_48_Tab[index][3];
443 4 Plain_48[NewKey_index] |= NewKey_data;
444 4 }
445 3 index++;
446 3 deal_data <<= 1;
447 3 }
448 2 }
449 1 }
450 /*
451 // 0 16 07 20 21 29 12 28 17
452 // 1 01 15 23 26 05 18 31 10
453 // 2 02 08 24 14 32 27 03 09
454 // 3 19 13 30 06 22 11 04 25
455 */
456 static unsigned char PBox_Replace_Tab[32][2]={
457 {0x01,0x80}, /* 1 */
458 {0x02,0x80}, /* 2 */
459 {0x02,0x02}, /* 3 */
460 {0x03,0x02}, /* 4 */
461 {0x01,0x08}, /* 5 */
462 {0x03,0x10}, /* 6 */
463 {0x00,0x40}, /* 7 */
464 {0x02,0x40}, /* 8 */
465
466 {0x02,0x01}, /* 9 */
467 {0x01,0x01}, /* 10 */
468 {0x03,0x04}, /* 11 */
469 {0x00,0x04}, /* 12 */
470 {0x03,0x40}, /* 13 */
471 {0x02,0x10}, /* 14 */
472 {0x01,0x40}, /* 15 */
473 {0x00,0x80}, /* 16 */
474
475 {0x00,0x01}, /* 17 */
476 {0x01,0x04}, /* 18 */
477 {0x03,0x80}, /* 19 */
478 {0x00,0x20}, /* 20 */
479 {0x00,0x10}, /* 21 */
480 {0x03,0x08}, /* 22 */
481 {0x01,0x20}, /* 23 */
482 {0x02,0x20}, /* 24 */
483
484 {0x03,0x01}, /* 25 */
485 {0x01,0x10}, /* 26 */
486 {0x02,0x04}, /* 27 */
487 {0x00,0x02}, /* 28 */
488 {0x00,0x08}, /* 29 */
489 {0x03,0x20}, /* 30 */
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 9
490 {0x01,0x02}, /* 31 */
491 {0x02,0x08} /* 32 */
492 };
493
494 /*
495 * P-Box 置换 32-bits ==> 32-bits
496 * 转换结果由in_data[]数组继续带回去
497 */
498 void Data_P_Box_Replace(unsigned char in_data[]) {
499 1 unsigned char temp_data[4];
500 1 unsigned char i,j,deal_data;
501 1 unsigned char index=0;
502 1 unsigned char NewKey_index,NewKey_data;
503 1
504 1 for (i=0;i<4;i++)
505 1 temp_data[i]=0;
506 1 for (i=0;i<4;i++) { /* 总共4字节, 4*8=32 */
507 2 deal_data=in_data[i]; /* 取第i个字节 */
508 2 for (j=0;j<8;j++) {
509 3 if ((deal_data & 0x80)==0x80) {
510 4 NewKey_index=PBox_Replace_Tab[index][0];
511 4 NewKey_data=PBox_Replace_Tab[index][1];
512 4 temp_data[NewKey_index] |= NewKey_data;
513 4 }
514 3 index++;
515 3 deal_data <<= 1;
516 3 }
517 2 }
518 1 for (i=0;i<4;i++)
519 1 in_data[i]=temp_data[i];
520 1 }
521 /*
522 * 将数组Source1[]与Source2[]异或,结果放于Source1[]中,共操作count个字节
523 */
524 void Xor_Data(unsigned char Source1[],unsigned char Source2[],unsigned char count) {
525 1 unsigned char i;
526 1
527 1 for (i=0;i<count;i++)
528 1 Source1[i]=Source1[i] ^ Source2[i];
529 1 }
530
531 /*
532 // 0 58 50 42 34 26 18 10 02
533 // 1 60 52 44 36 28 20 12 04
534 // 2 62 54 46 38 30 22 14 06
535 // 3 64 56 48 40 32 24 16 08
536 // 4 57 49 41 33 25 17 09 01
537 // 5 59 51 43 35 27 19 11 03
538 // 6 61 53 45 37 29 21 13 05
539 // 7 63 55 47 39 31 23 15 07
540 * 明文最开始的置换,即进入十六次循环之前的置换
541 */
542 static unsigned char Data_Init_Replace_Tab[64][2]={
543 {0x04,0x01}, /* 1 */
544 {0x00,0x01}, /* 2 */
545 {0x05,0x01}, /* 3 */
546 {0x01,0x01}, /* 4 */
547 {0x06,0x01}, /* 5 */
548 {0x02,0x01}, /* 6 */
549 {0x07,0x01}, /* 7 */
550 {0x03,0x01}, /* 8 */
551
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 10
552 {0x04,0x02}, /* 9 */
553 {0x00,0x02}, /* 10 */
554 {0x05,0x02}, /* 11 */
555 {0x01,0x02}, /* 12 */
556 {0x06,0x02}, /* 13 */
557 {0x02,0x02}, /* 14 */
558 {0x07,0x02}, /* 15 */
559 {0x03,0x02}, /* 16 */
560
561 {0x04,0x04}, /* 17 */
562 {0x00,0x04}, /* 18 */
563 {0x05,0x04}, /* 19 */
564 {0x01,0x04}, /* 20 */
565 {0x06,0x04}, /* 21 */
566 {0x02,0x04}, /* 22 */
567 {0x07,0x04}, /* 23 */
568 {0x03,0x04}, /* 24 */
569
570 {0x04,0x08}, /* 25 */
571 {0x00,0x08}, /* 26 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -