📄 des2.asm
字号:
;---------------------------------------------------------------
; 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 + -