⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des2.asm

📁 51环境汇编des加密
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------------------------------------------------------- 
;                DES加密解密算法 
;--------------------------------------------------------------- 
                NAME        DES64 

        
                
;                PUBLIC        DESMETHOD 

;DESCONST        SEGMENT        CODE 
;DES64                SEGMENT        CODE 


;                RSEG        DESCONST 
;--------------------------------------------------------------- 
;                        初始置换表,共64B 
;--------------------------------------------------------------- 
Data_IP:        DB        58,50,42,34,26,18,10,2 
                DB        60,52,44,36,28,20,12,4 
                DB        62,54,46,38,30,22,14,6 
                DB        64,56,48,40,32,24,16,8 
                DB        57,49,41,33,25,17, 9,1 
                DB        59,51,43,35,27,19,11,3 
                DB        61,53,45,37,29,21,13,5 
                DB        63,55,47,39,31,23,15,7 

;--------------------------------------------------------------- 
;                        终止置换表,共64B 
;--------------------------------------------------------------- 
Data_FP: 
                DB        40,8,48,16,56,24,64,32 
                DB        39,7,47,15,55,23,63,31 
                DB        38,6,46,14,54,22,62,30 
                DB        37,5,45,13,53,21,61,29 
                DB        36,4,44,12,52,20,60,28 
                DB        35,3,43,11,51,19,59,27 
                DB        34,2,42,10,50,18,58,26 
                DB        33,1,41, 9,49,17,57,25 

;--------------------------------------------------------------- 
;                        扩充置换表,共48B 
;--------------------------------------------------------------- 
DATA_EP:        DB        32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9 
                DB        8, 9,10,11,12,13,12,13,14,15,16,17 
                DB        16,17,18,19,20,21,20,21,22,23,24,25 
                      DB        24,25,26,27,28,29,28,29,30,31,32, 1 
;--------------------------------------------------------------- 
;                        PBOX置换表,共32B 
;--------------------------------------------------------------- 
Data_PBox:        DB        16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10 
                DB        2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25 
;--------------------------------------------------------------- 
;                        SBOX置换表,共256B 
;--------------------------------------------------------------- 
Data_SBox:        DB        0E4H,0D1H,02FH,0B8H,03AH,06CH,059H,007H 
                DB        00FH,074H,0E2H,0D1H,0A6H,0CBH,095H,038H 
                DB        041H,0E8H,0D6H,02BH,0FCH,097H,03AH,050H 
                DB        0FCH,082H,049H,017H,05BH,03EH,0A0H,06DH 
                DB        0F1H,08EH,06BH,034H,097H,02DH,0C0H,05AH 
                DB        03DH,047H,0F2H,08EH,0C0H,01AH,069H,0B5H 
                DB        00EH,07BH,0A4H,0D1H,058H,0C6H,093H,02FH 
                DB        0D8H,0A1H,03FH,042H,0B6H,07CH,005H,0E9H 
                DB        0A0H,09EH,063H,0F5H,01DH,0C7H,0B4H,028H 
                DB        0D7H,009H,034H,06AH,028H,05EH,0CBH,0F1H 
                DB        0D6H,049H,08FH,030H,0B1H,02CH,05AH,0E7H 
                DB        01AH,0D0H,069H,087H,04FH,0E3H,0B5H,02CH 
                DB        07DH,0E3H,006H,09AH,012H,085H,0BCH,04FH 
                DB        0D8H,0B5H,06FH,003H,047H,02CH,01AH,0E9H 
                DB        0A6H,090H,0CBH,07DH,0F1H,03EH,052H,084H 
                DB        03FH,006H,0A1H,0D8H,094H,05BH,0C7H,02EH 
                DB        02CH,041H,07AH,0B6H,085H,03FH,0D0H,0E9H 
                DB        0EBH,02CH,047H,0D1H,050H,0FAH,039H,086H 
                DB        042H,01BH,0ADH,078H,0F9H,0C5H,063H,00EH 
                DB        0B8H,0C7H,01EH,02DH,06FH,009H,0A4H,053H 
                DB        0C1H,0AFH,092H,068H,00DH,034H,0E7H,05BH 
                DB        0AFH,042H,07CH,095H,061H,0DEH,00BH,038H 
                DB        09EH,0F5H,028H,0C3H,070H,04AH,01DH,0B6H 
                DB        043H,02CH,095H,0FAH,0BEH,017H,060H,08DH 
                DB        04BH,02EH,0F0H,08DH,03CH,097H,05AH,061H 
                DB        0D0H,0B7H,049H,01AH,0E3H,05CH,02FH,086H 
                DB        014H,0BDH,0C3H,07EH,0AFH,068H,005H,092H 
                DB        06BH,0D8H,014H,0A7H,095H,00FH,0E2H,03CH 
                DB        0D2H,084H,06FH,0B1H,0A9H,03EH,050H,0C7H 
                DB        01FH,0D8H,0A3H,074H,0C5H,06BH,00EH,092H 
                DB        07BH,041H,09CH,0E2H,006H,0ADH,0F3H,058H 
                DB        021H,0E7H,04AH,08DH,0FCH,090H,035H,06BH 
;--------------------------------------------------------------- 
;                        密钥第一置换表,共56B 
;                        56-56位密钥置换表 
;--------------------------------------------------------------- 
KEY_PC1:        DB        50, 43, 36, 29, 22, 15, 08, 01  
                DB        51, 44, 37, 30, 23, 16, 09, 02  
                DB        52, 45, 38, 31, 24, 17, 10, 03  
                DB        53, 46, 39, 32, 56, 49, 42, 35  
                DB        28, 21, 14, 07, 55, 48, 41, 34  
                DB        27, 20, 13, 06, 54, 47, 40, 33  
                DB        26, 19, 12, 05, 25, 18, 11, 04 
;64-56位密钥置换表 
;        DB        57,49,41,33,25,17, 9, 1,58,50,42,34,26,18 
;        DB        10, 2,59,51,43,35,27,19,11, 3,60,52,44,36 
;        DB        63,55,47,39,31,23,15, 7,62,54,46,38,30,22 
;        DB        14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4 

;--------------------------------------------------------------- 
;                        密钥第二置换表,共48B 
;--------------------------------------------------------------- 
KEY_PC2:        DB        14,17,11,24,01,05,03,28,15,06,21,10 
                DB        23,19,12,04,26,08,16,07,27,20,13,02 
                DB        41,52,31,37,47,55,30,40,51,45,33,48 
                DB        44,49,39,56,34,53,46,42,50,36,29,32 

;--------------------------------------------------------------- 
;                密钥16次循环移位次数表,共16B 
;--------------------------------------------------------------- 
SHIFTBITS:        DB        1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 
                
;                RSEG        DES64 
                USING        0 
 
 
;--------------------------------------------------------------- 
;                        字节位置索引表,共48B 
;--------------------------------------------------------------- 
BITPOSTBL:        DB        1,2,4,8,10H,20H,40H,80H 
;--------------------------------------------------------------- 
;设置字节某一位 
;入口: 
;        B:        存储目的地址 
;        A:        存储第几位0..7 
;      R7:        存储要设置的值 
;--------------------------------------------------------------- 
SETBIT:              ;        PROC 
                PUSH        AR0 
                PUSH        DPH 
                PUSH        DPL                ;保护现场 
                MOV        R0,B                ;R0存储源地址 
                MOV        DPTR,#BITPOSTBL 
                MOVC        A,@A+DPTR 
                CJNE        R7,#0,SETBIT1 
                CPL        A 
                ANL        A,@R0 
                JMP        SETBIT2 
SETBIT1:        ORL        A,@R0 
SETBIT2:        MOV        @R0,A 
                POP        DPL                ;恢复现场 
                POP        DPH 
                POP        AR0 
                RET 
;ENDP 
;--------------------------------------------------------------- 
;获得源地址字节的一位值 
;入口: 
;        B:        存储源地址 
;        A:        存储第几位0..7 
;出口:  R7:        返回第几位的值 
;--------------------------------------------------------------- 
GETBIT:        ;        PROC 
                PUSH        AR0 
                PUSH        DPH 
                PUSH        DPL                ;保护现场 
                MOV        R0,B                ;R0存储源地址 
                MOV        DPTR,#BITPOSTBL 
                MOVC        A,@A+DPTR 
                ANL        A,@R0 
                MOV        R7,A 
                POP        DPL                ;恢复现场 
                POP        DPH 
                POP        AR0 
                RET 
;ENDP 
;--------------------------------------------------------------- 
;移动程序数据到内存 
;入口: 
;        R0:        存储源地址起始字节索引 
;        DPTR:        存储源地址 
;        R1:        存储目的地址 
;        R2:        存储移动长度 
;占用资源: 
;        A,R0,R1,R2,DPTR 
;--------------------------------------------------------------- 
MOVCODEBYTE: ;        PROC 
                MOV        A,R0 
                MOVC        A,@A+DPTR 
                MOV        @R1,A 
                INC        R0 
                INC        R1 
                DJNZ        R2,MOVCODEBYTE 
                RET 
;--------------------------------------------------------------- 
;移动内存块 
;入口: 
;        R0:        存储源地址 
;        R1:        存储目的地址 
;        R2:        存储移动长度 
;--------------------------------------------------------------- 
MOVRAMBYTE:;        PROC 
                MOV        A,@R0 
                MOV        @R1,A 
                INC        R0 
                INC        R1 
                DJNZ        R2,MOVRAMBYTE 
                RET 
;--------------------------------------------------------------- 
;交换内存块 
;入口: 
;        R0:        存储源地址 
;        R1:        存储目的地址 
;        R2:        存储交换长度 
;--------------------------------------------------------------- 
XCHRAMBYTE:;        PROC 
                MOV        A,@R0 
                XCH        A,@R1 
                MOV        @R0,A 
                INC        R0 
                INC        R1 
                DJNZ        R2,XCHRAMBYTE 
                RET 
 

;--------------------------------------------------------------- 
;根据位置换表进行位置换 
;入口 
;        R0:        源表起始地址 
;        R1:        目的表起始地址 
;        R2:        目的子节地址索引0..N 
;        R3:        目的子节位索引8..1 
;        DPTR:        位置换表地址 
;--------------------------------------------------------------- 
CALA:        ;        PROC 
                PUSH        B 
                PUSH        AR7 
                MOV        A,R2                ;A=R2目的子节地址索引0..N 
                INC        A                ;A=R2+1 
                RL        A 
                RL        A 
                RL        A 
                ANL        A,#0F8H                ;A=(R2+1)*8 
                CLR        C 
                SUBB        A,R3                ;A=R2*8-R3 
                MOVC        A,@A+DPTR 

                DEC        A                ;A=源表位地址 
                PUSH        ACC 
                ANL        A,#0F8H 
                RR        A 
                RR        A 
                RR        A                ;A=源表字节地址索引=源表位地址/8 
                ADD        A,R0 
                MOV        B,A                ;B=源字节绝对地址 
                POP        ACC                ;A=源表位地址 
                ANL        A,#7 
                CPL        A 
                INC        A 
                ADD        A,#7                ;源字节位索引A=7-(A%8) 
                CALL        GETBIT                ;R7为获得的置换位 
                MOV        A,R1 
                ADD        A,R2                ;A=目的字节地址 
                MOV        B,A                ;B=目的字节地址 
                MOV        A,R3 
                DEC        A                ;A=目的字节位索引 
                CALL        SETBIT 
                POP        AR7 
                POP        B 
                RET 
;ENDP 
;-------------------------------------- 
;DES64加解密子程序 
;入口: 
;        8:        存储源表和目的表基地址 
;        9:        存储密钥地址 
;        10:        存储加密解密方式0--解密1-加密 
;-------------------------------- 
DESMETHOD:;        PROC 
                MOV        R0,8                ;对源进行初始置换,R0=源表基地址 
                MOV        R1,#10H                ;R1=目的表基地址 
                MOV        DPTR,#DATA_IP        ;DPTR=位置换表基地址 
                MOV        R2,#0                ;R2=字节循环变量0..7 
DES1:                MOV        R3,#8                ;R3=位循环变量8..1 
DES2:                CALL        CALA                ;进行置换 
                DJNZ        R3,DES2 
                INC        R2 
                CJNE        R2,#8,DES1 
                
                MOV        A,10 
                JNZ        DES3                ;加密跳转 
        
                MOV        R0,#10H                ;(10)=0是解密过程将初始置换后的64位数据高低32位互换 
                MOV        R1,#14H 
                MOV        R2,#4 
                CALL        XCHRAMBYTE 

                

DES3:                MOV        R0,#10H                        ;将置换后的数转移到源地址 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -