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

📄 des.inc

📁 microchip网站上找的pic18F458单片机的示例代码
💻 INC
📖 第 1 页 / 共 2 页
字号:
;   permuted key in keyl:keyr
; On exit:
;   plaintext in left:right

;                             call =    2 cycles
;   4 calls to roundr @ 324 cycles = 1296 cycles
; 12 calls to roundr2 @ 344 cycles = 4128 cycles
;                      goto swaplr =   20 cycles
;                                    -----------
;                            total = 5446 cycles

desinvcore:
	call	roundr		; round 1
	call	roundr2		; round 2
	call	roundr2		; round 3
	call	roundr2		; round 4
	call	roundr2		; round 5
	call	roundr2		; round 6
	call	roundr2		; round 7
	call	roundr		; round 8
	call	roundr2		; round 9
	call	roundr2		; round 10
	call	roundr2		; round 11
	call	roundr2		; round 12
	call	roundr2		; round 13
	call	roundr2		; round 14
	call	roundr		; round 15
	call	roundr		; round 16

	goto	swaplr


;-----------------------------------------------------------------------------
; key rotation subroutines
;-----------------------------------------------------------------------------

; The 16 rounds of the DES each use a different 48-bit subkey, which is
; generated by INDFependently rotating the two 28-bit halves of the 56-bit key,
; then using Permuted Choice 2 to extract the 48 bit subkey.
;
; Since the PIC doesn't have enough RAM to store precomputed subkeys, the
; rotations are done on the fly using these subroutines.  The Permuted Choice
; 2 function is done as part of the xorkey macro calls.


; On entry and exit, the current subkey is in keyl:keyr.

; keyrotl takes 18 cycles including call

keyrotl:
        bcf     STATUS,C
	rlf	keyl+3
	rlf	keyl+2
	rlf	keyl+1
	rlf	keyl+0
        btfsc   STATUS,C
	bsf	k28

        bcf     STATUS,C
	rlf	keyr+3
	rlf	keyr+2
	rlf	keyr+1
	rlf	keyr+0
        btfsc   STATUS,C
	bsf	k56

	return


; keyrotr takes 20 cycles including call

keyrotr:
        bcf     STATUS,C
	rrf	keyl+0
	rrf	keyl+1
	rrf	keyl+2
	rrf	keyl+3
	btfsc	keyl+3,3
	bsf	k01
	bcf	keyl+3,3

        bcf     STATUS,C
	rrf	keyr+0
	rrf	keyr+1
	rrf	keyr+2
	rrf	keyr+3
	btfsc	keyr+3,3
	bsf	k29
	bcf	keyr+3,3

	return


;-----------------------------------------------------------------------------
; DES round macros
;-----------------------------------------------------------------------------

; The gethi and getlo macros implement six bit sections of the Expansion
; Permutation.

; 6 cycles
gethi   macro   rbyte,b20r,b20b,b10r,b10b
        swapf   rbyte,W
        andlw   0x0f
        btfsc   b20r,b20b
        iorlw   0x20
        btfsc   b10r,b10b
        iorlw   0x10
	endm

; 6 cycles
getlo   macro   rbyte,b20r,b20b,b10r,b10b
        movf    rbyte,W
        andlw   0x0f
        btfsc   b20r,b20b
        iorlw   0x20
        btfsc   b10r,b10b
        iorlw   0x10
	endm

; The xorkey macro is used to exclusive-or the 6-bit result of the Expansion
; Permuation in the W register (as generated by the gethi or getlo macros
; above) with the appropriate 6 bits of the current subkey (as defined by
; Permuted Choice 2).  The arguments are the six subkey bits to be used.

; 12 cycles
xorkey  macro   b20r,b20b,b10r,b10b,b08r,b08b,b04r,b04b,b02r,b02b,b01r,b01b
        btfsc   b20r,b20b
        xorlw   0x20
        btfsc   b10r,b10b
        xorlw   0x10
        btfsc   b08r,b08b
        xorlw   0x08
        btfsc   b04r,b04b
        xorlw   0x04
        btfsc   b02r,b02b
        xorlw   0x02
        btfsc   b01r,b01b
        xorlw   0x01
	endm

; The corehi and corelo macros are used to perform the S-box lookup and
; the P-box permutation.    The only difference between the two macros is
; which half of the sbox table value is used.  The corehi macro must be
; used for S-boxes 1, 3, 5, and 7, while the corelo macro must be used for
; S-boxes 2, 4, 6, and 8.

; The first argument to the macro is the entry point of the S-box table to
; be used.

; The second through fifth arguments to the macro are the bits that the
; P-box permutes the S-box outputs into, in order from the most to the least
; significant.

; 15 cycles for sbox12
; 16 cycles for others
corehi  macro   sbox,b7r,b7b,b6r,b6b,b5r,b5b,b4r,b4b
	call	sbox			; 6 cycles for sbox12,
					; 7 cycles for others
	movwf	temp
	btfsc	temp,7
        bsf     b7r,b7b
	btfsc	temp,6
        bsf     b6r,b6b
	btfsc	temp,5
        bsf     b5r,b5b
	btfsc	temp,4
        bsf     b4r,b4b
	endm

; 15 cycles for sbox12
; 16 cycles for others
corelo  macro   sbox,b3r,b3b,b2r,b2b,b1r,b1b,b0r,b0b
	call	sbox			; 6 cycles for sbox12,
					; 7 cycles for others
	movwf	temp
	btfsc	temp,3
        bsf     b3r,b3b
	btfsc	temp,2
        bsf     b2r,b2b
	btfsc	temp,1
        bsf     b1r,b1b
	btfsc	temp,0
        bsf     b0r,b0b
	endm


;-----------------------------------------------------------------------------
; one round of DES (with various key rotations)
;-----------------------------------------------------------------------------

; roundr2 = 344 cycles
; roundr  = 324 cycles

roundr2:
	call	round
	call	keyrotr		; 20 cycles
	goto	keyrotr		; 20 cycles

roundr:
	call	round		; 302 cycles
	goto	keyrotr		;  20 cycles

; roundl2 = 338 cycles including call
; roundl  = 320 cycles including call

roundl2:
	call	keyrotl		; 18 cycles
roundl:
	call	keyrotl		; 18 cycles
; fall into round


; xxx cycles including call
;                 call =   2 cycles
;           clear newr =   4 cycles
; 2 sboxes @ 33 cycles =  66 cycles
; 6 sboxes @ 34 cycles = 204 cycles
;                  xor =   8 cycles
;                 swap =  16 cycles
;               return =   2 cycles
;                        ----------
;                total = 302 cycles

round:
; clear newr to make it easy to do the P-box permutation (by simply setting
; bits)
	clrf	newr+0
	clrf	newr+1
	clrf	newr+2
	clrf	newr+3	

; do s-box 1
	gethi	right+0,r32,r05			; 6 cycles
	xorkey	k14,k05,k17,k11,k24,k01		; 12 cycles
	corehi	sbox12,nr09,nr17,nr23,nr31	; 15 cycles

; do s-box 2
	getlo	right+0,r04,r09			; 6 cycles
	xorkey	k03,k10,k28,k15,k06,k21		; 12 cycles
	corelo	sbox12,nr13,nr28,nr02,nr18	; 15 cycles

; do s-box 3
	gethi	right+1,r08,r13			; 6 cycles
	xorkey	k23,k08,k19,k12,k04,k26		; 12 cycles
	corehi	sbox34,nr24,nr16,nr30,nr06	; 16 cycles

; do s-box 4
	getlo	right+1,r12,r17			; 6 cycles
	xorkey	k16,k02,k07,k27,k20,k13		; 12 cycles
	corelo	sbox34,nr26,nr20,nr10,nr01	; 16 cycles

; do s-box 5
	gethi	right+2,r16,r21			; 6 cycles
	xorkey	k41,k55,k52,k31,k37,k47		; 12 cycles
	corehi	sbox56,nr08,nr14,nr25,nr03	; 16 cycles

; do s-box 6
	getlo	right+2,r20,r25			; 6 cycles
	xorkey	k30,k48,k40,k51,k45,k33		; 12 cycles
	corelo	sbox56,nr04,nr29,nr11,nr19	; 16 cycles

; do s-box 7
	gethi	right+3,r24,r29			; 6 cycles
	xorkey	k44,k53,k49,k39,k56,k34		; 12 cycles
	corehi	sbox78,nr32,nr12,nr22,nr07	; 16 cycles

; do s-box 8
	getlo	right+3,r28,r01			; 6 cycles
	xorkey	k46,k32,k42,k50,k36,k29		; 12 cycles
	corelo	sbox78,nr05,nr27,nr15,nr21	; 16 cycles

; now exclusive-or the old left with the new right to complete the
; computation

        movf    left+0,W
	xorwf	newr+0
        movf    left+1,W
	xorwf	newr+1
        movf    left+2,W
	xorwf	newr+2
        movf    left+3,W
	xorwf	newr+3

; now swap the stuff around

        movf    right+0,W
	movwf	left+0
        movf    right+1,W
	movwf	left+1
        movf    right+2,W
	movwf	left+2
        movf    right+3,W
	movwf	left+3

        movf    newr+0,W
	movwf	right+0
        movf    newr+1,W
	movwf	right+1
        movf    newr+2,W
	movwf	right+2
        movf    newr+3,W
	movwf	right+3

	return


;-----------------------------------------------------------------------------
; s-box table lookup functions
;-----------------------------------------------------------------------------

; Because of the way they are accessed, all of the S-box data tables must
; reside within the same page of ROM.  Since the S-box data consumes
; exactly 256 words of memory, the actual entry points to the table lookup
; functions must be stored in a different page.  As usual on the midrange
; PIC processors, it is important that PCLATH be set to the correct page
; prior to calling the table lookup functions.

; 6 cycles including call
sbox12:
        movwf   PCL

; 7 cycles including call
sbox34:
	iorlw	040h
        movwf   PCL

; 7 cycles including call
sbox56:
	iorlw	080h
        movwf   PCL

; 7 cycles including call
sbox78:
	iorlw	0c0h
        movwf   PCL


;-----------------------------------------------------------------------------
; s-box data tables
;-----------------------------------------------------------------------------

        ifdef   sboxbase
        org     sboxbase
        else
        org     ($+0xff)&~0xff  ; force page alignment
sboxbase:
        endif

; Since the output width of each S-box is four bits, each S-box table as
; stored in ROM contains two S-boxes; each data byte is split between the two
; with the most significant four bits of the byte storing the output of the
; lower numbered sbox.  For example, the most significant four bits of each
; byte of sbox12 are used to store S-box 1, and the least significant four
; bits are used to store S-box 2.

; S boxes one and two
        dt      0xef, 0x41, 0xd8, 0x1e, 0x26, 0xfb, 0xb3, 0x84
        dt      0x39, 0xa7, 0x62, 0xcd, 0x5c, 0x90, 0x05, 0x7a
        dt      0x03, 0xfd, 0x74, 0x47, 0xef, 0x22, 0xd8, 0x1e
        dt      0xac, 0x60, 0xc1, 0xba, 0x96, 0x59, 0x3b, 0x85
        dt      0x40, 0x1e, 0xe7, 0x8b, 0xda, 0x64, 0x2d, 0xb1
        dt      0xf5, 0xc8, 0x9c, 0x76, 0x39, 0xa3, 0x52, 0x0f
        dt      0xfd, 0xc8, 0x8a, 0x21, 0x43, 0x9f, 0x14, 0x72
        dt      0x5b, 0xb6, 0x37, 0xec, 0xa0, 0x05, 0x6e, 0xd9

; S boxes three and four
        dt      0xa7, 0x0d, 0x9e, 0xe3, 0x60, 0x36, 0xf9, 0x5a
        dt      0x11, 0xd2, 0xc8, 0x75, 0xbb, 0x4c, 0x24, 0x8f
        dt      0xdd, 0x78, 0x0b, 0x95, 0x36, 0x4f, 0x60, 0xa3
        dt      0x24, 0x87, 0x52, 0xec, 0xc1, 0xba, 0xfe, 0x19
        dt      0xda, 0x66, 0x49, 0x90, 0x8c, 0xfb, 0x37, 0x0d
        dt      0xbf, 0x11, 0x23, 0xce, 0x55, 0xa2, 0xe8, 0x74
        dt      0x13, 0xaf, 0xd0, 0x06, 0x6a, 0x91, 0x8d, 0x78
        dt      0x49, 0xf4, 0xe5, 0x3b, 0xbc, 0x57, 0x22, 0xce

; S boxes five and six
        dt      0x2c, 0xc1, 0x4a, 0x1f, 0x79, 0xa2, 0xb6, 0x68
        dt      0x80, 0x5d, 0x33, 0xf4, 0xde, 0x07, 0xe5, 0x9b
        dt      0xea, 0xbf, 0x24, 0xc2, 0x47, 0x7c, 0xd9, 0x15
        dt      0x56, 0x01, 0xfd, 0xae, 0x30, 0x9b, 0x83, 0x68
        dt      0x49, 0x2e, 0x1f, 0xb5, 0xa2, 0xd8, 0x7c, 0x83
        dt      0xf7, 0x90, 0xc4, 0x5a, 0x61, 0x3d, 0x0b, 0xe6
        dt      0xb4, 0x83, 0xc2, 0x7c, 0x19, 0xe5, 0x2f, 0xda
        dt      0x6b, 0xfe, 0x01, 0x97, 0xa6, 0x40, 0x58, 0x3d

; S boxes seven and eight
        dt      0x4d, 0xb2, 0x28, 0xe4, 0xf6, 0x0f, 0x8b, 0xd1
        dt      0x3a, 0xc9, 0x93, 0x7e, 0x55, 0xa0, 0x6c, 0x17
        dt      0xd1, 0x0f, 0xbd, 0x78, 0x4a, 0x93, 0x17, 0xa4
        dt      0xec, 0x35, 0x56, 0xcb, 0x20, 0xfe, 0x89, 0x62
        dt      0x17, 0x4b, 0xb4, 0xd1, 0xc9, 0x3c, 0x7e, 0xe2
        dt      0xa0, 0xf6, 0x6a, 0x8d, 0x0f, 0x53, 0x95, 0x28
        dt      0x62, 0xb1, 0xde, 0x87, 0x14, 0x4a, 0xa8, 0x7d
        dt      0x9f, 0x5c, 0x09, 0xf0, 0xe3, 0x25, 0x36, 0xcb

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -