📄 desfor51.asm
字号:
;=========================================================================
;功能:完成DES算法
; ==>Ln=Rn-1;Rn=Ln-1 xor f(Rn-1,Kn)
;名称:Des_Arithmetic()
;入口: #MINGWEN,8字节明文;#MIYUE,8字节密钥;
;出口: #DES_MIWEN,8字节密文;
;占用:FLAG_TEMP,30H~3FH,40H~43H,48H~4FH,ACC,R0,R1,R2,R5,R6,R7
;其它:a、字节的bit7~0,对应位置的1~8
; b、因为用到直接寻址,变量需定义在00H~80H
; c、51汇编,foc=12M,program by 唐TB DATE:2003/08/12~14
; d、代码长度: 约1.5K字节 运行时间: 约11.2ms 深度:0级(无调用)
;=========================================================================
FLAG_TEMP DATA 20H ;DES算法要用到的位单元
BIT_00H BIT 00H ;对应第8位
BIT_01H BIT 01H ;对应第7位
BIT_02H BIT 02H ;对应第6位
BIT_03H BIT 03H ;对应第5位
BIT_04H BIT 04H ;对应第4位
BIT_05H BIT 05H ;对应第3位
BIT_06H BIT 06H ;对应第2位
BIT_07H BIT 07H ;对应第1位
DES_TEMP0 EQU 30H ;计算(L0,R0),(C0,D0)时暂用单元,8BYTES
DES_TEMP1 DATA 31H
DES_TEMP2 DATA 32H
DES_TEMP3 DATA 33H
DES_TEMP4 DATA 34H
DES_TEMP5 DATA 35H
DES_TEMP6 DATA 36H
DES_TEMP7 DATA 37H
DES_MIWEN EQU 30H ;密文首地址
DES_Ln0 EQU 30H ;存储Ln(0~3)
DES_Ln1 DATA 31H
DES_Ln2 DATA 32H
DES_Ln3 DATA 33H
DES_Rn0 DATA 34H ;存储Dn(0~3)
DES_Rn1 DATA 35H
DES_Rn2 DATA 36H
DES_Rn3 DATA 37H
MINGWEN EQU 38H ;明文首地址,8bytes
DES_L0 DATA 38H ;存储Ln-1(0~3)
DES_L1 DATA 39H
DES_L2 DATA 3AH
DES_L3 DATA 3BH
DES_R0 DATA 3CH ;存储Rn-1(0~3)
DES_R1 DATA 3DH
DES_R2 DATA 3EH
DES_R3 DATA 3FH
DES_Ki EQU 40H ;Ki首地址,4BYTE
DES_Ki0 DATA 40H
DES_Ki1 DATA 41H
DES_Ki2 DATA 42H
DES_Ki3 DATA 43H
MIYUE EQU 48H ;*64位密钥,8BYTE
DES_C0 DATA 48H ;存储Cn(0~3)
DES_C1 DATA 49H
DES_C2 DATA 4AH
DES_C3 DATA 4BH
DES_D0 DATA 4CH ;存储Dn(0~3)
DES_D1 DATA 4DH
DES_D2 DATA 4EH
DES_D3 DATA 4FH
;-------------------------------------------------------------------------
BCD_BYTE3 DATA 40H ;for HEX-->BCD
BCD_BYTE2 DATA 41H
BCD_BYTE1 DATA 42H
BCD_BYTE0 DATA 43H
;=========================================================================
ORG 0000H
AJMP MAIN
ORG 0030H
;=========================================================================
;构造Cn,Dn的循环移位次数表
;-------------------------------------------------------------------------
HDESR0L: DB 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,1
;-------------------------------------------------------------------------
;8个选择函数Si
;-------------------------------------------------------------------------
HDESSI0: DB 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7
DB 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8
DB 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0
DB 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13
HDESSI1: DB 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10
DB 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5
DB 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15
DB 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9
HDESSI2: DB 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8
DB 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1
DB 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7
DB 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12
HDESSI3: DB 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15
DB 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9
DB 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4
DB 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14
HDESSI4: DB 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9
DB 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6
DB 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14
DB 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3
HDESSI5: DB 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11
DB 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8
DB 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6
DB 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13
HDESSI6: DB 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1
DB 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6
DB 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2
DB 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12
HDESSI7: DB 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7
DB 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2
DB 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8
DB 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11
;-------------------------------------------------------------------------
;说明:DES算法开始
;-------------------------------------------------------------------------
Des_Arithmetic:
;-------------------------------------------------------------------------
;功能:得到L0,R0
;出口:DES_L0~3,DES_R0~3 ;786us
;-------------------------------------------------------------------------
DES_GET_LR0:MOV R1,#DES_TEMP0 ;取得暂存首地址
MOV R7,#08H ;8个字节的8次循环
DES_GET_LRA:MOV R2,#00H ;位暂存清0
MOV R6,#08H ;1个字节的8次循环
MOV R0,#MINGWEN ;取得明文首地址
DES_GET_LRB:MOV A,@R0
MOV C,ACC.7 ;取得1个字节的1位,
MOV A,R2
RRC A ;acc.0对应位置8,故向右移
MOV R2,A
MOV A,@R0
RL A ;该数据移位,准备取下一位
MOV @R0,A
INC R0
DJNZ R6,DES_GET_LRB ;1个字节ok?
MOV A,R2
MOV @R1,A ;ok则存储之
INC R1
DJNZ R7,DES_GET_LRA ;8个字节都初始置换完毕?
MOV DES_L0,DES_TEMP1 ;是,则得到相应的L0,R0
MOV DES_L1,DES_TEMP3
MOV DES_L2,DES_TEMP5
MOV DES_L3,DES_TEMP7
MOV DES_R0,DES_TEMP0
MOV DES_R1,DES_TEMP2
MOV DES_R2,DES_TEMP4
MOV DES_R3,DES_TEMP6
;-------------------------------------------------------------------------
;功能:得到C0,D0
;出口:DES_C0~3,DES_D0~3 ;691us
;-------------------------------------------------------------------------
DES_GET_CD0:MOV R1,#DES_TEMP0 ;取得暂存首地址
MOV R7,#07H ;7个字节的7次循环
DES_GET_CDA:MOV R2,#00H ;位暂存清0
MOV R6,#08H ;1个字节的8次循环
MOV R0,#MIYUE ;取得密钥首地址
DES_GET_CDB:MOV A,@R0
MOV C,ACC.7 ;取得1个字节的1位
MOV A,R2
RRC A
MOV R2,A
MOV A,@R0
RL A ;该数据移位,准备取下一位
MOV @R0,A
INC R0
DJNZ R6,DES_GET_CDB ;1个字节ok?
MOV A,R2
MOV @R1,A ;ok则存储之
INC R1
DJNZ R7,DES_GET_CDA ;7个字节都初始置换完毕?
MOV DES_C0,DES_TEMP0 ;得C0~3
MOV DES_C1,DES_TEMP1
MOV DES_C2,DES_TEMP2
MOV A,DES_TEMP3
MOV DES_C3,A ;C3的高4位
MOV DES_D0,DES_TEMP6 ;得D0~3
MOV DES_D1,DES_TEMP5
MOV DES_D2,DES_TEMP4
MOV A,DES_TEMP3
SWAP A
MOV DES_D3,A ;D3的高4位
;-------------------------------------------------------------------------
;循环16次,以得L16,R16
;-------------------------------------------------------------------------
MOV R5,#16
DES_LOOP16: NOP
;-------------------------------------------------------------------------
;功能:得到Ln=Rn-1
;出口:DES_Ln0~3
;-------------------------------------------------------------------------
MOV DES_Ln0,DES_R0
MOV DES_Ln1,DES_R1
MOV DES_Ln2,DES_R2
MOV DES_Ln3,DES_R3
;-------------------------------------------------------------------------
;功能:得到Cn-1,Dn-1,查表移位
;-------------------------------------------------------------------------
MOV DPTR,#HDESR0L ;取得表首地址
MOV A,R5
MOVC A,@A+DPTR
MOV R7,A ;取得移位次数于R7
DES_CiDi_A: MOV A,DES_C3 ;C0~3循环移位
RLC A
MOV DES_C3,A
MOV A,DES_C2
RLC A
MOV DES_C2,A
MOV A,DES_C1
RLC A
MOV DES_C1,A
MOV A,DES_C0
RLC A
MOV DES_C0,A
MOV A,DES_C3
MOV ACC.4,C
MOV DES_C3,A
MOV A,DES_D3 ;D0~3循环移位
RLC A
MOV DES_D3,A
MOV A,DES_D2
RLC A
MOV DES_D2,A
MOV A,DES_D1
RLC A
MOV DES_D1,A
MOV A,DES_D0
RLC A
MOV DES_D0,A
MOV A,DES_D3
MOV ACC.4,C
MOV DES_D3,A
DJNZ R7,DES_CiDi_A
;-------------------------------------------------------------------------
;***********************(Rn-1,Kn),Ki,32->48扩展,Si***********************
;-------------------------------------------------------------------------
;说明:a、以6位为单位,取得Ki及32到48位的扩展,这6位以"b5b0,b4b3b2b1"存放;
; b、异或实现模2加,然后查si盒子,得新的数据,并把相邻两字节整合为1字节
;出口:DES_Ki0~3
;-------------------------------------------------------------------------
;功能:得6bit,第1字节高4位
;-------------------------------------------------------------------------
;14 17 11 24 1 5==>14 5 17 11 24 1 第1行Ki
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_C1 ;14 11-->2 5
MOV C,ACC.2
MOV BIT_05H,C
MOV C,ACC.5
MOV BIT_02H,C
MOV A,DES_C2 ;17 24-->7 0
MOV C,ACC.7
MOV BIT_03H,C
MOV C,ACC.0
MOV BIT_01H,C
MOV A,DES_C0 ;1 5-->7 3
MOV C,ACC.7
MOV BIT_00H,C
MOV C,ACC.3
MOV BIT_04H,C
MOV DES_Ki0,FLAG_TEMP
;32 1 2 3 4 5==>32 5 1 2 3 4 第1列Ln 32->48
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln3 ;32-->0
MOV C,ACC.0
MOV BIT_05H,C
MOV A,DES_Ln0 ;1 2 3 4 5-->7 6 5 4 3
MOV C,ACC.3
MOV BIT_04H,C
ANL A,#0F0H
SWAP A
ORL A,FLAG_TEMP
XRL A,DES_Ki0 ;对应位模2加,即异或
ANL A,#3FH
MOV DPTR,#HDESSI0 ;由表S0查询得Ki0高4位
MOVC A,@A+DPTR
SWAP A
MOV DES_Ki0,A
;-------------------------------------------------------------------------
;功能:得6bit,第1字节 DES_Ki0
;-------------------------------------------------------------------------
;3 28 15 6 21 10==>3 10 28 15 6 21 第2行Ki
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_C0 ;3,6-->5 2
MOV C,ACC.5
MOV BIT_05H,C
MOV C,ACC.2
MOV BIT_01H,C
MOV A,DES_C1 ;15,10-->1,6
MOV C,ACC.1
MOV BIT_02H,C
MOV C,ACC.6
MOV BIT_04H,C
MOV A,DES_C2 ;21-->3
MOV C,ACC.3
MOV BIT_00H,C
MOV A,DES_C3 ;28-->4
MOV C,ACC.4
MOV BIT_03H,C
MOV R7,FLAG_TEMP
;4 5 6 7 8 9==>4 9 5 6 7 8 第2行Ln 32->48
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln1 ;9-->7
MOV C,ACC.7
MOV BIT_04H,C
MOV A,DES_Ln0 ;4 5 6 7 8-->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,#HDESSI1 ;由表S1查询得Ki0低4位
MOVC A,@A+DPTR
ORL DES_Ki0,A
;-------------------------------------------------------------------------
;功能:得6bit,第2字节高4位
;-------------------------------------------------------------------------
;23 19 12 4 26 8==>23 8 19 12 4 26
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_C0 ;4 8-->4 0
MOV C,ACC.4
MOV BIT_01H,C
MOV C,ACC.0
MOV BIT_04H,C
MOV A,DES_C1 ;12-->4
MOV C,ACC.4
MOV BIT_02H,C
MOV A,DES_C2 ;19 23-->5 1
MOV C,ACC.5
MOV BIT_03H,C
MOV C,ACC.1
MOV BIT_05H,C
MOV A,DES_C3 ;26-->6
MOV C,ACC.6
MOV BIT_00H,C
MOV DES_Ki1,FLAG_TEMP
;8 9 10 11 12 13==>8 13 9 10 11 12
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln0 ;8-->0
MOV C,ACC.0
MOV BIT_05H,C
MOV A,DES_Ln1 ;9 10 11 12 13-->7 6 5 4 3
MOV C,ACC.3
MOV BIT_04H,C
ANL A,#0F0H
SWAP A
ORL A,FLAG_TEMP
XRL A,DES_Ki1 ;对应位模2加,即异或
ANL A,#3FH
MOV DPTR,#HDESSI2 ;由表S2查询得Ki1高4位
MOVC A,@A+DPTR
SWAP A
MOV DES_Ki1,A
;-------------------------------------------------------------------------
;功能:得6bit,第2字节 DES_Ki1
;-------------------------------------------------------------------------
;16 7 27 20 13 2==>16 2 7 27 20 13
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_C0 ;2 7-->6 1
MOV C,ACC.6
MOV BIT_04H,C
MOV C,ACC.1
MOV BIT_03H,C
MOV A,DES_C1 ;16,13-->0 3
MOV C,ACC.0
MOV BIT_05H,C
MOV C,ACC.3
MOV BIT_00H,C
MOV A,DES_C2 ;20-->4
MOV C,ACC.4
MOV BIT_01H,C
MOV A,DES_C3 ;27-->5
MOV C,ACC.5
MOV BIT_02H,C
MOV R7,FLAG_TEMP
;12 13 14 15 16 17==>12 17 13 14 15 16
; 5 4 3 2 1 0
MOV FLAG_TEMP,#00H
MOV A,DES_Ln2 ;17-->7
MOV C,ACC.7
MOV BIT_04H,C
MOV A,DES_Ln1 ;12 13 14 15 16-->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,#HDESSI3 ;由表S3查询得Ki1低4位
MOVC A,@A+DPTR
ORL DES_Ki1,A
;-------------------------------------------------------------------------
;功能:得6bit,第3字节高4位
;-------------------------------------------------------------------------
;41 52 31 37 47 55==>41 55 52 31 37 47
; 5 4 3 2 1 0
;MOV FLAG_TEMP,#00H
MOV A,DES_D0 ;31-28=3-->5
MOV C,ACC.5
MOV BIT_02H,C
MOV A,DES_D1 ;37-28=9 41-28=13-->7 3
MOV C,ACC.7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -