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

📄 desfor51.asm

📁 51平台的标准DES算法,在ATMEL89C52上验证通过,用keil51编译
💻 ASM
📖 第 1 页 / 共 2 页
字号:
			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 + -