📄 desfor51.asm
字号:
MOV BIT_01H,C
MOV C,ACC.3
MOV BIT_05H,C
MOV A,DES_D2 ;47-28=19-->5 52-28=24-->0
MOV C,ACC.5
MOV BIT_00H,C
MOV C,ACC.0
MOV BIT_03H,C
MOV A,DES_D3 ;55-28=27-->5
MOV C,ACC.5
MOV BIT_04H,C
MOV DES_Ki2,FLAG_TEMP
;16 17 18 19 20 21==>16 21 17 18 19 20
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln1 ;16-->0
MOV C,ACC.0
MOV BIT_05H,C
MOV A,DES_Ln2 ;21 17 18 19 20-->3 7 6 5 4
MOV C,ACC.3
MOV BIT_04H,C
ANL A,#0F0H
SWAP A
ORL A,FLAG_TEMP
XRL A,DES_Ki2 ;对应位模2加,即异或
ANL A,#3FH
MOV DPTR,#HDESSI4 ;由表S4查询得Ki2高4位
MOVC A,@A+DPTR
SWAP A
MOV DES_Ki2,A
;-------------------------------------------------------------------------
;功能:得6bit,第3字节DES_Ki2
;-------------------------------------------------------------------------
;30 40 51 45 33 48==>30 48 40 51 45 33
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_D0 ;30-28=2-->6 33-28=5-->3
MOV C,ACC.6
MOV BIT_05H,C
MOV C,ACC.3
MOV BIT_00H,C
MOV A,DES_D1 ;40-28=12-->4
MOV C,ACC.4
MOV BIT_03H,C
MOV A,DES_D2 ;48-28=20-->4 51-28=23-->1 45-28=17-->7
MOV C,ACC.4
MOV BIT_04H,C
MOV C,ACC.1
MOV BIT_02H,C
MOV C,ACC.7
MOV BIT_01H,C
MOV R7,FLAG_TEMP
;20 21 22 23 24 25==>20 25 21 22 23 24
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln3 ;25-->7
MOV C,ACC.7
MOV BIT_04H,C
MOV A,DES_Ln2 ;20 21 22 23 24-->4 3 2 1 0
MOV C,ACC.4
MOV BIT_05H,C
ANL A,#0FH
ORL A,FLAG_TEMP
XRL A,R7 ;对应位模2加,即异或
ANL A,#3FH
MOV DPTR,#HDESSI5 ;由表S5查询得Ki2低4位
MOVC A,@A+DPTR
ORL DES_Ki2,A
;-------------------------------------------------------------------------
;功能:得6bit,第4字节高4位
;-------------------------------------------------------------------------
;44 49 39 56 34 53==>44 53 49 39 56 34
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_D0 ;34-28=6-->2
MOV C,ACC.2
MOV BIT_00H,C
MOV A,DES_D1 ;44-28=16-->0 39-28=11-->5
MOV C,ACC.0
MOV BIT_05H,C
MOV C,ACC.5
MOV BIT_02H,C
MOV A,DES_D2 ;49-28=21-->3
MOV C,ACC.3
MOV BIT_03H,C
MOV A,DES_D3 ;53-28=25-->7 56-28=28-->4
MOV C,ACC.7
MOV BIT_04H,C
MOV C,ACC.4
MOV BIT_01H,C
MOV DES_Ki3,FLAG_TEMP
;24 25 26 27 28 29==>24 29 25 26 27 28
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln2 ;24-->0
MOV C,ACC.0
MOV BIT_05H,C
MOV A,DES_Ln3 ;29 25 26 27 28-->3 7 6 5 4
MOV C,ACC.3
MOV BIT_04H,C
ANL A,#0F0H
SWAP A
ORL A,FLAG_TEMP
XRL A,DES_Ki3 ;对应位模2加,即异或
ANL A,#3FH
MOV DPTR,#HDESSI6 ;由表S6查询得Ki3高4位
MOVC A,@A+DPTR
SWAP A
MOV DES_Ki3,A
;-------------------------------------------------------------------------
;功能:得6bit,第4字节 DES_Ki3
;-------------------------------------------------------------------------
;46 42 50 36 29 32==>46 32 42 50 36 29
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_D0 ;29-28=1-->7 32-28=4-->4 36-28=8-->0
MOV C,ACC.7
MOV BIT_00H,C
MOV C,ACC.4
MOV BIT_04H,C
MOV C,ACC.0
MOV BIT_01H,C
MOV A,DES_D1 ;42-28=14-->2
MOV C,ACC.2
MOV BIT_03H,C
MOV A,DES_D2 ;50-28=22-->2 46-28=18-->6
MOV C,ACC.2
MOV BIT_02H,C
MOV C,ACC.6
MOV BIT_05H,C
MOV R7,FLAG_TEMP
;28 29 30 31 32 1==>28 1 29 30 31 32
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln0 ;1-->7
MOV C,ACC.7
MOV BIT_04H,C
MOV A,DES_Ln3 ;28-->4
MOV C,ACC.4
MOV BIT_05H,C
MOV A,DES_Ln3 ;29 30 31 32-->3 2 1 0
ANL A,#0FH
ORL A,FLAG_TEMP
XRL A,R7 ;对应位模2加,即异或
ANL A,#3FH
MOV DPTR,#HDESSI7 ;由表S7查询得Ki3低4位
MOVC A,@A+DPTR
ORL DES_Ki3,A
;-------------------------------------------------------------------------
;**********f(Rn-1,Kn).32bit置换,并得Rn=Ln-1 xor f(Rn-1,Kn)**************
;出口:DES_R0~3
;-------------------------------------------------------------------------
;功能:得Rn0
;-------------------------------------------------------------------------
;16 7 20 21 29 12 28 17
; 7 6 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_Ki1 ;16-->0 12-->4
MOV C,ACC.0
MOV BIT_07H,C
MOV C,ACC.4
MOV BIT_02H,C
MOV A,DES_Ki0 ;7-->1
MOV C,ACC.1
MOV BIT_06H,C
MOV A,DES_Ki2 ;17-->7 20-->4 21-->3
MOV C,ACC.7
MOV BIT_00H,C
MOV C,ACC.4
MOV BIT_05H,C
MOV C,ACC.3
MOV BIT_04H,C
MOV A,DES_Ki3 ;28-->4 29-->3
MOV C,ACC.4
MOV BIT_01H,C
MOV C,ACC.3
MOV BIT_03H,C
MOV A,FLAG_TEMP
XRL A,DES_L0
MOV DES_R0,A
;-------------------------------------------------------------------------
;功能:得Rn1
;-------------------------------------------------------------------------
;1 15 23 26 5 18 31 10
;7 6 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_Ki0 ;1 5-->7 3
MOV C,ACC.7
MOV BIT_07H,C
MOV C,ACC.3
MOV BIT_03H,C
MOV A,DES_Ki1 ;10 15-->6 1
MOV C,ACC.6
MOV BIT_00H,C
MOV C,ACC.1
MOV BIT_06H,C
MOV A,DES_Ki2 ;23 18-->1 6
MOV C,ACC.1
MOV BIT_05H,C
MOV C,ACC.6
MOV BIT_02H,C
MOV A,DES_Ki3 ;26 31-->6 1
MOV C,ACC.6
MOV BIT_04H,C
MOV C,ACC.1
MOV BIT_01H,C
MOV A,FLAG_TEMP
XRL A,DES_L1
MOV DES_R1,A
;-------------------------------------------------------------------------
;功能:得Rn2
;-------------------------------------------------------------------------
;2 8 24 14 32 27 3 9
;7 6 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_Ki0 ;2 3 8-->6 5 0
MOV C,ACC.6
MOV BIT_07H,C
MOV C,ACC.5
MOV BIT_01H,C
MOV C,ACC.0
MOV BIT_06H,C
MOV A,DES_Ki1 ;14-->2 9-->7
MOV C,ACC.2
MOV BIT_04H,C
MOV C,ACC.7
MOV BIT_00H,C
MOV A,DES_Ki2 ;24-->0
MOV C,ACC.0
MOV BIT_05H,C
MOV A,DES_Ki3 ;27 32-->5 0
MOV C,ACC.5
MOV BIT_02H,C
MOV C,ACC.0
MOV BIT_03H,C
MOV A,FLAG_TEMP
XRL A,DES_L2
MOV DES_R2,A
;-------------------------------------------------------------------------
;功能:得Rn3
;-------------------------------------------------------------------------
;19 13 30 6 22 11 4 25
; 7 6 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_Ki0 ;4 6-->4 2
MOV C,ACC.4
MOV BIT_01H,C
MOV C,ACC.2
MOV BIT_04H,C
MOV A,DES_Ki1 ;11 13-->5 3
MOV C,ACC.5
MOV BIT_02H,C
MOV C,ACC.3
MOV BIT_06H,C
MOV A,DES_Ki2 ;22-->2 19-->5
MOV C,ACC.2
MOV BIT_03H,C
MOV C,ACC.5
MOV BIT_07H,C
MOV A,DES_Ki3 ;25 30-->7 2
MOV C,ACC.7
MOV BIT_00H,C
MOV C,ACC.2
MOV BIT_05H,C
MOV A,FLAG_TEMP
XRL A,DES_L3
MOV DES_R3,A
;-------------------------------------------------------------------------
MOV DES_L0,DES_Ln0 ;DES_L0~3存储Ln-1
MOV DES_L1,DES_Ln1
MOV DES_L2,DES_Ln2
MOV DES_L3,DES_Ln3
DEC R5
MOV A,R5
JZ DES_GET_R16
AJMP DES_LOOP16 ;16次未到,则继续
;-------------------------------------------------------------------------
;功能:得到R16-->DES_Rn0~3
;出口:DES_Rn0~3
;-------------------------------------------------------------------------
DES_GET_R16:MOV DES_Rn0,DES_R0 ;16次到,得R16
MOV DES_Rn1,DES_R1
MOV DES_Rn2,DES_R2
MOV DES_Rn3,DES_R3
;-------------------------------------------------------------------------
;功能:R16L16初始置换的逆作用
;出口:#MIWEN 8字节(Ln0~3,Rn0~3)
;-------------------------------------------------------------------------
MOV DES_L0,DES_Ln0 ;调整字节位置,以便循环操作
MOV DES_L1,DES_Rn0
MOV DES_L2,DES_Ln1
MOV DES_L3,DES_Rn1
MOV DES_R0,DES_Ln2
MOV DES_R1,DES_Rn2
MOV DES_R2,DES_Ln3
MOV DES_R3,DES_Rn3
MOV R1,#DES_TEMP0 ;取得暂存首地址
MOV R7,#08H ;8个字节的8次循环
DES_GET_LR16A:
MOV R2,#00H ;位暂存清0
MOV R6,#08H ;1个字节的8次循环
MOV R0,#MINGWEN ;取得首地址
DES_GET_LR16B:
MOV A,@R0
MOV C,ACC.0 ;取得1个字节的1位,acc.7的逆取acc.0
MOV A,R2
RLC A ;第1位为最高位
MOV R2,A
MOV A,@R0
RR A ;该数据移位,准备取下一位
MOV @R0,A
INC R0
DJNZ R6,DES_GET_LR16B ;1个字节ok?
MOV A,R2
MOV @R1,A ;ok则存储之
INC R1
DJNZ R7,DES_GET_LR16A ;8个字节都初始置换完毕?
;-------------------------------------------------------------------------
;功能: DES_Rn0~3 异或 DES_Ln0~3
;出口:DES_Ln0~3
;-------------------------------------------------------------------------
;Kyle delete this section at 2006-11-19
; MOV A,DES_Rn0
; XRL DES_Ln0,A
;
; MOV A,DES_Rn1
; XRL DES_Ln1,A
;
; MOV A,DES_Rn2
; XRL DES_Ln2,A
;
; MOV A,DES_Rn3
; XRL DES_Ln3,A
RET
;--------------------------------------------------------------------------
;***************************DES 加密算法结束*******************************
;==========================================================================
;功能:4字节HEX-->4字节BCD,采用移位带进位自加1的算法;
;名称:HEX4_BCD4()
;入口:(高)DES_TEMP0,DES_TEMP1,DES_TEMP2,DES_TEMP3
;出口:(高)BCD_BYTE3,BCD_BYTE2,BCD_BYTE1,BCD_BYTE0
;--------------------------------------------------------------------------
HEX4_BCD4: CLR A
MOV BCD_BYTE0,A
MOV BCD_BYTE1,A
MOV BCD_BYTE2,A
MOV BCD_BYTE3,A
MOV R7,#32
HEX4_BCD4_A:MOV R0,#DES_TEMP0+3
MOV R6,#04
CLR C
HEX4_BCD4_B:MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R6,HEX4_BCD4_B
MOV R6,#04
MOV R1,#BCD_BYTE0
HEX4_BCD4_C:MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DEC R1
DJNZ R6,HEX4_BCD4_C
DJNZ R7,HEX4_BCD4_A
RET
;==========================================================================
;TEST Des_Arithmetic
;--------------------------------------------------------------------------
MAIN: CLR EA
MOV SP,#60H
NOP
MOV 48H,#5bH ;64bits密钥
MOV 49H,#79H
MOV 4AH,#6cH
MOV 4BH,#65H
MOV 4CH,#32H
MOV 4DH,#51H
MOV 4EH,#69H
MOV 4FH,#6EH
MOV 38H,#0a7H ;64bits明文
MOV 39H,#97H
MOV 3AH,#09H
MOV 3BH,#6aH
MOV 3CH,#0a5H
MOV 3DH,#6aH
MOV 3EH,#0b3H
MOV 3FH,#3eH
ACALL Des_Arithmetic ;A6 0E A8 32 58 CC E8 ED=>LR异或 FEC240DFh
NOP
ACALL HEX4_BCD4 ;74143455
NOP
SJMP $
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -