📄 des2.asm
字号:
MOV R1,8
MOV R2,#8
CALL MOVRAMBYTE ;初始置换完毕,结果仍存到原位置(8)+0..(8)+7
MOV R0,9 ;对密钥进行缩位变换,R0=源表基地址
MOV R1,#10H ;R1=目的表基地址
MOV DPTR,#KEY_PC1 ;DPTR=位置换表基地址
MOV R2,#0 ;R2=字节循环变量0..7
DES4: MOV R3,#8 ;R3=位循环变量8..1
DES5: CALL CALA ;进行置换
DJNZ R3,DES5
INC R2
CJNE R2,#7,DES4
MOV R0,#10H ;将置换后的数转移到源地址
MOV R1,9
MOV R2,#7
CALL MOVRAMBYTE ;缩位置换完毕,结果仍存到原位置(9)+0..(9)+6
MOV R6,#0 ;进行16次迭代,R6=16次迭代循环变量
DES6: MOV A,8 ;对8字节数据的右32位作扩充冲变换扩充到48位,结果存到10H..15H中
ADD A,#4
MOV R0,A ;R0=源表基地址
MOV R1,#10H ;R1=目的表基地址
MOV DPTR,#DATA_EP ;DPTR=位置换表基地址
MOV R2,#0 ;R2=字节循环变量0..7
DES7: MOV R3,#8 ;R3=位循环变量8..1
DES8: CALL CALA ;进行置换
DJNZ R3,DES8
INC R2
CJNE R2,#6,DES7 ;对56位密钥进行移位结果仍在原位置(9)+0..(9)+6
MOV R5,#0 ;循环变量 循环次数=每一次需要移位的次数
MOV A,10
JZ DES11 ;解密跳转
DES9: MOV B,9 ;是加密过程
MOV A,#7
CALL GETBIT ;R7=56位密钥第0位
PUSH AR7 ;保存R7
MOV R0,9
MOV R4,#0 ;循环变量 56位=7字节 循环次数=7 从0到6
DES10: MOV A,@R0
RL A
MOV @R0,A ;左移一?
MOV A,R0
MOV R1,A
INC R1
MOV A,@R1 ;A=下一字节内容
ANL A,#80H
MOV R7,A ;R7=下一字节BIT7
MOV B,R0
MOV A,#0
CALL SETBIT ;本字节BIT0=R7
INC R0
INC R4
CJNE R4,#7,DES10 ;循环左移完毕
MOV A,9
ADD A,#3
MOV R0,A
MOV A,@R0 ;A=密钥3字节
ANL A,#10H
MOV R7,A ;R7=密钥3字节4位即移位后的27位
MOV A,9
ADD A,#6
MOV B,A
MOV A,#0
CALL SETBIT ;移位后的密钥55位=移位后的密钥27位
POP AR7 ;移位前密钥0位
MOV A,9
ADD A,#3
MOV B,A
MOV A,#4
CALL SETBIT ;移位后的密钥27位=R7,完成一次KEY的循环左移
MOV A,R6
MOV DPTR,#SHIFTBITS
MOVC A,@A+DPTR ;A=本次迭代循环次数
INC R5
CJNE A,5,DES9 ;全部循环完毕获得本次运算密钥
JMP DES13 ;本次运算密钥计算完毕
DES11: MOV A,R6
JZ DES13 ;是解密过程,解密时第一轮不移位
MOV A,9 ;9存放56位密钥起始地址
ADD A,#6
MOV R0,A ;R0=56位密钥字节6
MOV B,A ;B=56位密钥字节6
MOV A,#0 ;第0位
CALL GETBIT ;R7=为56位密钥55位
PUSH AR7 ;保存R7
MOV R4,#7 ;循环变量 56位=7字节 循环次数=7 从0到6
DES12: MOV A,@R0
RR A
MOV @R0,A ;右移一位
MOV A,R0
MOV R1,A
DEC R1
MOV A,@R1 ;A=上一字节内容
ANL A,#1
MOV R7,A ;R7=上一字节BIT0
MOV B,R0
MOV A,#7
CALL SETBIT ;本字节BIT7=R7
DEC R0
DJNZ R4,DES12 ;循环右移完毕
MOV A,9
ADD A,#3
MOV R0,A
MOV A,@R0 ;A=密钥3字节
ANL A,#8
MOV R7,A ;R7=密钥3字节3位即移位后的28位
MOV B,9
MOV A,#7
CALL SETBIT ;移位后56位密钥第0位=R7
POP AR7 ;R7:移位前为56位密钥55位
MOV A,9
ADD A,#3
MOV B,A
MOV A,#3
CALL SETBIT ;移位后的密钥28位=R7,完成一次KEY的循环右移
MOV A,#10H
CLR C
SUBB A,R6
MOV DPTR,#SHIFTBITS
MOVC A,@A+DPTR ;A=本次循环移位次数
INC R5
CJNE A,5,DES11 ;全部循环完毕获得本次运算密钥
DES13: MOV R0,9 ;R0=源表基地址
MOV R1,#16H ;R1=目的表基地址
MOV DPTR,#KEY_PC2 ;DPTR=位置换表基地址
MOV R2,#0 ;R2=字节循环变量0..7
DES14: MOV R3,#8 ;R3=位循环变量8..1
DES15: CALL CALA ;进行置换
DJNZ R3,DES15
INC R2
CJNE R2,#6,DES14 ;对本次运算密钥作缩位运算获得48位子金钥,结果存到16H..1BH
MOV R0,#10H ;将16H..1BH的内容和10H..15H的内容相异或然后放到16H..1BH中10H..15H的内容可以抛弃
MOV R1,#16H
MOV R2,#6
DES16: MOV A,@R0
XRL A,@R1
MOV @R1,A
INC R0
INC R1
DJNZ R2,DES16
MOV DPTR,#DATA_SBOX ;对16H..1BH的内容作S-BOX置换结果放入10H..13H
MOV R2,#0 ;循环变量 从0..7
DES17: MOV 1CH,#0 ;(1CH)=0=SBOX表寻址单元
MOV R3,#0 ;循环变量 从0..5
DES18: MOV A,R2
MOV B,#6
MUL AB ;A=R2*6
ADD A,R3 ;A=R2*6+R3
PUSH ACC
ANL A,#0F8H
RR A
RR A
RR A ;A=(R2*6+R3)/8
ADD A,#16H
MOV B,A ;B存放源表地址字节索引
POP ACC
ANL A,#7
CPL A
INC A
ADD A,#7 ;A=7-(R2*6+R3)%8 存放源表位索引
CALL GETBIT ;R7=源表的B字节A位
CJNE R3,#0,DES19
MOV R0,#5 ;如R3==0,R0=SBOX表寻址单元1位
JMP DES21
DES19: CJNE R3,#5,DES20
MOV R0,#4 ;如R3==5,R0=SBOX表寻址单元0位
JMP DES21
DES20: MOV A,#4
CLR C
SUBB A,R3
MOV R0,A ;如0 <R3 <5,R0=SBOX寻址单元8-R3位
DES21: MOV B,#1CH ;B=SBOX寻址单元地址=1CH
MOV A,R0
CALL SETBIT
INC R3
CJNE R3,#6,DES18
MOV A,1CH ;计算SBOX寻址单元
ANL A,#1
PUSH ACC
MOV A,1CH
ANL A,#0FEH
RR A
MOV 1CH,A
MOV A,R2 ;第R2个6BIT
MOV B,#32
MUL AB
ADD A,1CH ;(1CH)=SBOX地址?
MOVC A,@A+DPTR ;A=查SBOX表值
POP AR0
CJNE R0,#0,DES22
ANL A,#0F0H
SWAP A ;如R0==0则A=SBOX表值高4位
JMP DES23
DES22: ANL A,#0FH ;如R0==1则A=SBOX表值低4位
DES23: MOV 1CH,A ;1CH的低4位存放6位源经SBOX变换后的结果
MOV A,R2
ANL A,#1
PUSH ACC
MOV A,R2
ANL A,#0FEH
RR A
ADD A,#10H
MOV R0,A ;R0=目标绝对地址
POP ACC
JNZ DES24 ;如R2%2==0 则R0(H4BIT)=(1CH)
MOV A,1CH
SWAP A ;A=SBOX结果
JMP DES25
DES24: MOV A,@R0
ORL A,1CH
DES25: MOV @R0,A
INC R2
CJNE R2,#8,DES17
; CJNE R2,#8,DES33 ;SBOX变换完毕结果在10H..13H
; JMP DES34
; DES33:
; JMP DES17
;进行PBOX变换
; DES34:
MOV R0,#10H
MOV R1,#14H
MOV DPTR,#DATA_PBOX
MOV R2,#0
DES26: MOV R3,#8
DES27: CALL CALA ;进行置换
DJNZ R3,DES27
INC R2
CJNE R2,#4,DES26 ;PBOX置换完毕结果在14H..17H
MOV R0,#14H ;14H..17H结果和8单元引用的起始地址相异或,结果放入14..17H中
MOV R1,8
MOV R2,#4
DES28: MOV A,@R1
XRL A,@R0
MOV @R0,A
INC R0
INC R1
DJNZ R2,DES28
MOV A,8 ;将源码的后32位移到前32位
ADD A,#4
MOV R0,A
MOV R1,8
MOV R2,#4
CALL MOVRAMBYTE
MOV R0,#14H ;将14H..17H移到源码的后32位
MOV A,8
ADD A,#4
MOV R1,A
MOV R2,#4
CALL MOVRAMBYTE
INC R6
CJNE R6,#10H,DES32 ;16次迭代运算完毕
MOV A,10 ;判断加密解密
JNZ DES29 ;加密跳转
MOV R0,8
MOV A,8
ADD A,#4
MOV R1,A
MOV R2,#4
CALL XCHRAMBYTE
JMP DES29
DES32: JMP DES6
DES29: MOV R0,8 ;对源作逆置换到10H..17H
MOV R1,#10H
MOV DPTR,#DATA_FP
MOV R2,#0
DES30: MOV R3,#8
DES31: CALL CALA ;进行置换
DJNZ R3,DES31
INC R2
CJNE R2,#8,DES30
MOV R0,#10H ;将置换后的数转移到源地址
MOV R1,8
MOV R2,#8
CALL MOVRAMBYTE
RET
;ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -