📄 des.lst
字号:
572 {0x05,0x08}, /* 27 */
573 {0x01,0x08}, /* 28 */
574 {0x06,0x08}, /* 29 */
575 {0x02,0x08}, /* 30 */
576 {0x07,0x08}, /* 31 */
577 {0x03,0x08}, /* 32 */
578
579 {0x04,0x10}, /* 33 */
580 {0x00,0x10}, /* 34 */
581 {0x05,0x10}, /* 35 */
582 {0x01,0x10}, /* 36 */
583 {0x06,0x10}, /* 37 */
584 {0x02,0x10}, /* 38 */
585 {0x07,0x10}, /* 39 */
586 {0x03,0x10}, /* 40 */
587
588 {0x04,0x20}, /* 41 */
589 {0x00,0x20}, /* 42 */
590 {0x05,0x20}, /* 43 */
591 {0x01,0x20}, /* 44 */
592 {0x06,0x20}, /* 45 */
593 {0x02,0x20}, /* 46 */
594 {0x07,0x20}, /* 47 */
595 {0x03,0x20}, /* 48 */
596
597 {0x04,0x40}, /* 49 */
598 {0x00,0x40}, /* 50 */
599 {0x05,0x40}, /* 51 */
600 {0x01,0x40}, /* 52 */
601 {0x06,0x40}, /* 53 */
602 {0x02,0x40}, /* 54 */
603 {0x07,0x40}, /* 55 */
604 {0x03,0x40}, /* 56 */
605
606 {0x04,0x80}, /* 57 */
607 {0x00,0x80}, /* 58 */
608 {0x05,0x80}, /* 59 */
609 {0x01,0x80}, /* 60 */
610 {0x06,0x80}, /* 61 */
611 {0x02,0x80}, /* 62 */
612 {0x07,0x80}, /* 63 */
613 {0x03,0x80}, /* 64 */
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 11
614 };
615
616 /*
617 * 待转换的数据(明文)最开始的置换 64-bits ==> 64-bits
618 * 转换结果由in_data[]数组继续带回去
619 */
620 void Data_Init_Replace(unsigned char in_data[]) {
621 1 unsigned char temp_data[8];
622 1 unsigned char i,j,deal_data;
623 1 unsigned char index=0;
624 1 unsigned char NewKey_index,NewKey_data;
625 1
626 1 for (i=0;i<8;i++)
627 1 temp_data[i]=0;
628 1 for (i=0;i<8;i++) { /* 总共8字节(64-bits) */
629 2 deal_data=in_data[i]; /* 取第i个字节 */
630 2 for (j=0;j<8;j++) {
631 3 if ((deal_data & 0x80)==0x80) {
632 4 NewKey_index=Data_Init_Replace_Tab[index][0];
633 4 NewKey_data=Data_Init_Replace_Tab[index][1];
634 4 temp_data[NewKey_index] |= NewKey_data;
635 4 }
636 3 index++;
637 3 deal_data <<= 1;
638 3 }
639 2 }
640 1 for (i=0;i<8;i++)
641 1 in_data[i]=temp_data[i];
642 1 }
643
644 /*
645 // 0 40 08 48 16 56 24 64 32
646 // 1 39 07 47 15 55 23 63 31
647 // 2 38 06 46 14 54 22 62 30
648 // 3 37 05 45 13 53 21 61 29
649 // 4 36 04 44 12 52 20 60 28
650 // 5 35 03 43 11 51 19 59 27
651 // 6 34 02 42 10 50 18 58 26
652 // 7 33 01 41 09 49 17 57 25
653 * 最后形成密文前的置换
654 */
655 static unsigned char Data_End_Replace_Tab[64][2]={
656 {0x07,0x40}, /* 1 */
657 {0x06,0x40}, /* 2 */
658 {0x05,0x40}, /* 3 */
659 {0x04,0x40}, /* 4 */
660 {0x03,0x40}, /* 5 */
661 {0x02,0x40}, /* 6 */
662 {0x01,0x40}, /* 7 */
663 {0x00,0x40}, /* 8 */
664
665 {0x07,0x10}, /* 9 */
666 {0x06,0x10}, /* 10 */
667 {0x05,0x10}, /* 11 */
668 {0x04,0x10}, /* 12 */
669 {0x03,0x10}, /* 13 */
670 {0x02,0x10}, /* 14 */
671 {0x01,0x10}, /* 15 */
672 {0x00,0x10}, /* 16 */
673
674 {0x07,0x04}, /* 17 */
675 {0x06,0x04}, /* 18 */
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 12
676 {0x05,0x04}, /* 19 */
677 {0x04,0x04}, /* 20 */
678 {0x03,0x04}, /* 21 */
679 {0x02,0x04}, /* 22 */
680 {0x01,0x04}, /* 23 */
681 {0x00,0x04}, /* 24 */
682
683 {0x07,0x01}, /* 25 */
684 {0x06,0x01}, /* 26 */
685 {0x05,0x01}, /* 27 */
686 {0x04,0x01}, /* 28 */
687 {0x03,0x01}, /* 29 */
688 {0x02,0x01}, /* 30 */
689 {0x01,0x01}, /* 31 */
690 {0x00,0x01}, /* 32 */
691
692 {0x07,0x80}, /* 33 */
693 {0x06,0x80}, /* 34 */
694 {0x05,0x80}, /* 35 */
695 {0x04,0x80}, /* 36 */
696 {0x03,0x80}, /* 37 */
697 {0x02,0x80}, /* 38 */
698 {0x01,0x80}, /* 39 */
699 {0x00,0x80}, /* 40 */
700
701 {0x07,0x20}, /* 41 */
702 {0x06,0x20}, /* 42 */
703 {0x05,0x20}, /* 43 */
704 {0x04,0x20}, /* 44 */
705 {0x03,0x20}, /* 45 */
706 {0x02,0x20}, /* 46 */
707 {0x01,0x20}, /* 47 */
708 {0x00,0x20}, /* 48 */
709
710 {0x07,0x08}, /* 49 */
711 {0x06,0x08}, /* 50 */
712 {0x05,0x08}, /* 51 */
713 {0x04,0x08}, /* 52 */
714 {0x03,0x08}, /* 53 */
715 {0x02,0x08}, /* 54 */
716 {0x01,0x08}, /* 55 */
717 {0x00,0x08}, /* 56 */
718
719 {0x07,0x02}, /* 57 */
720 {0x06,0x02}, /* 58 */
721 {0x05,0x02}, /* 59 */
722 {0x04,0x02}, /* 60 */
723 {0x03,0x02}, /* 61 */
724 {0x02,0x02}, /* 62 */
725 {0x01,0x02}, /* 63 */
726 {0x00,0x02}, /* 64 */
727 };
728
729 /*
730 * 经过下面的转换后,密文最后形成 64-bits ==> 64-bits
731 * 转换结果由in_data[]数组继续带回去
732 */
733 void Data_End_Replace(unsigned char in_data[]) {
734 1 unsigned char temp_data[8];
735 1 unsigned char i,j,deal_data;
736 1 unsigned char index=0;
737 1 unsigned char NewKey_index,NewKey_data;
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 13
738 1
739 1 for (i=0;i<8;i++)
740 1 temp_data[i]=0;
741 1 for (i=0;i<8;i++) { /* 总共8字节(64-bits) */
742 2 deal_data=in_data[i]; /* 取第i个字节 */
743 2 for (j=0;j<8;j++) {
744 3 if ((deal_data & 0x80)==0x80) {
745 4 NewKey_index=Data_End_Replace_Tab[index][0];
746 4 NewKey_data=Data_End_Replace_Tab[index][1];
747 4 temp_data[NewKey_index] |= NewKey_data;
748 4 }
749 3 index++;
750 3 deal_data <<= 1;
751 3 }
752 2 }
753 1 for (i=0;i<8;i++)
754 1 in_data[i]=temp_data[i];
755 1 }
756
757
758 /*
759 * 加密时每次循环密码向左移动位数表
760 */
761 static unsigned char EncrypKeyRotateTimesTab[]={
762 1,1,2,2,2,2,2,2,
763 1,2,2,2,2,2,2,1
764 };
765 /*
766 * 加密程序
767 */
768 extern void Encryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
769 1 unsigned char Key_56[7],Key_48[6];
770 1 unsigned char temp[8];
771 1 char i,j;
772 1
773 1 Key64_To_56(Key_64,Key_56); /* 得到真正的56-bits密码 */
774 1 Data_Init_Replace(PlainTxt); // 最开始一次置换
775 1 for (i=0;i<16;i++) {
776 2 for (j=0;j<4;j++) /* 上层的右半部分直接作为下层的左半部 */
777 2 CipherTxt[j]=PlainTxt[4+j]; /* L(i)=L(i-1) */
778 2 Data_32_To_48(PlainTxt+4,temp); /* 数据从32-bits扩展到48-bits */
779 2 KeyRotate(Key_56,EncrypKeyRotateTimesTab[i],0); /* rotate left */
780 2 Key_56_To_48(Key_56,Key_48); /* 密码压缩置换 */
781 2 Xor_Data(temp,Key_48,6); /* 异或6个字节 */
782 2 S_Box_Replace(temp); /* 48-bits ==> 32-bits */
783 2 Data_P_Box_Replace(temp); /* P盒置换 */
784 2 Xor_Data(temp,PlainTxt,4); /* 异或4个字节 */
785 2 if (i==15) { /* 最后一次左右不交换 */
786 3 for (j=0;j<4;j++)
787 3 PlainTxt[4+j]=CipherTxt[j];
788 3 for (j=0;j<4;j++)
789 3 PlainTxt[j]=temp[j];
790 3 }
791 2 else {
792 3 for (j=0;j<4;j++)
793 3 PlainTxt[4+j]=temp[j];
794 3 for (j=0;j<4;j++)
795 3 PlainTxt[j]=CipherTxt[j];
796 3 }
797 2 }
798 1 for (i=0;i<8;i++)
799 1 CipherTxt[i]=PlainTxt[i];
C51 COMPILER V6.12 DES 01/17/2003 18:27:26 PAGE 14
800 1 Data_End_Replace(CipherTxt); // 最后一次置换
801 1 }
802
803 /*
804 * 解密时每次循环密码向右移动位数表
805 */
806 static unsigned char DecrypKeyRotateTimesTab[]={
807 0,1,2,2,2,2,2,2,
808 1,2,2,2,2,2,2,1
809 };
810 /*
811 * 解密程序
812 */
813 extern void Decryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
814 1 unsigned char Key_56[7],Key_48[6];
815 1 unsigned char temp[8];
816 1 char i,j;
817 1
818 1 Key64_To_56(Key_64,Key_56); /* 得到真正的56-bits密码 */
819 1 Data_Init_Replace(PlainTxt); /* 最开始一次置换 */
820 1 for (i=0;i<16;i++) {
821 2 for (j=0;j<4;j++) /* 上层的右半部分直接作为下层的左半部 */
822 2 CipherTxt[j]=PlainTxt[4+j]; /* L(i)=L(i-1) */
823 2 Data_32_To_48(PlainTxt+4,temp); /* 数据从32-bits扩展到48-bits */
824 2 KeyRotate(Key_56,DecrypKeyRotateTimesTab[i],1); /* rotate right */
825 2 Key_56_To_48(Key_56,Key_48); /* 密码压缩置换 */
826 2 Xor_Data(temp,Key_48,6); /* 异或6个字节 */
827 2 S_Box_Replace(temp); /* 48-bits ==> 32-bits */
828 2 Data_P_Box_Replace(temp); /* P盒置换 */
829 2 Xor_Data(temp,PlainTxt,4); /* 异或4个字节 */
830 2 if (i==15) { /* 最后一次左右不交换 */
831 3 for (j=0;j<4;j++)
832 3 PlainTxt[4+j]=CipherTxt[j];
833 3 for (j=0;j<4;j++)
834 3 PlainTxt[j]=temp[j];
835 3 }
836 2 else {
837 3 for (j=0;j<4;j++)
838 3 PlainTxt[4+j]=temp[j];
839 3 for (j=0;j<4;j++)
840 3 PlainTxt[j]=CipherTxt[j];
841 3 }
842 2 }
843 1 for (i=0;i<8;i++)
844 1 CipherTxt[i]=PlainTxt[i];
845 1 Data_End_Replace(CipherTxt); // 最后一次置换
846 1 }
847
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3307 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 1256 160
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -