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

📄 des.inc

📁 microchip网站上找的pic18F458单片机的示例代码
💻 INC
📖 第 1 页 / 共 2 页
字号:
;-----------------------------------------------------------------------------
; DESPICable - DES (FIPS PUB 46, ANSI X3.92-1981) for the PIC16Cxx
; Copyright 1994, 1996, 1997 Eric L. Smith
;
; $Header$
;-----------------------------------------------------------------------------


;-----------------------------------------------------------------------------
; RAM definitions
;-----------------------------------------------------------------------------

        cblock
keyl:   4
keyr:   4

left:   4
right:  4
newr:   4
        endc


;-----------------------------------------------------------------------------
; bit definitions
;-----------------------------------------------------------------------------

        if      0

; This is how it should be done, but MPASM 1.40 is buggy and won't do
; macro argument substitution in defines!

equb8	macro	base,b1,b2,b3,b4,b5,b6,b7,b8
#define	b1	base,7
#define	b2	base,6
#define	b3	base,5
#define	b4	base,4
#define	b5	base,3
#define	b6	base,2
#define	b7	base,1
#define	b8	base,0
	endm

equb4	macro	base,b1,b2,b3,b4
#define	b1	base,7
#define	b2	base,6
#define	b3	base,5
#define	b4	base,4
	endm

	equb8	keyl+0,k01,k02,k03,k04,k05,k06,k07,k08
	equb8	keyl+1,k09,k10,k11,k12,k13,k14,k15,k16
	equb8	keyl+2,k17,k18,k19,k20,k21,k22,k23,k24
	equb4	keyl+3,k25,k26,k27,k28

	equb8	keyr+0,k29,k30,k31,k32,k33,k34,k35,k36
	equb8	keyr+1,k37,k38,k39,k40,k41,k42,k43,k44
	equb8	keyr+2,k45,k46,k47,k48,k49,k50,k51,k52
	equb4	keyr+3,k53,k54,k55,k56

	equb8	right+0,r01,r02,r03,r04,r05,r06,r07,r08
	equb8	right+1,r09,r10,r11,r12,r13,r14,r15,r16
	equb8	right+2,r17,r18,r19,r20,r21,r22,r23,r24
	equb8	right+3,r25,r26,r27,r28,r29,r30,r31,r32

	equb8	newr+0,nr01,nr02,nr03,nr04,nr05,nr06,nr07,nr08
	equb8	newr+1,nr09,nr10,nr11,nr12,nr13,nr14,nr15,nr16
	equb8	newr+2,nr17,nr18,nr19,nr20,nr21,nr22,nr23,nr24
	equb8	newr+3,nr25,nr26,nr27,nr28,nr29,nr30,nr31,nr32

        else

; this mess is the workaround for the MPASM bug described above.

#define k01 keyl+0,7
#define k02 keyl+0,6
#define k03 keyl+0,5
#define k04 keyl+0,4
#define k05 keyl+0,3
#define k06 keyl+0,2
#define k07 keyl+0,1
#define k08 keyl+0,0
#define k09 keyl+1,7
#define k10 keyl+1,6
#define k11 keyl+1,5
#define k12 keyl+1,4
#define k13 keyl+1,3
#define k14 keyl+1,2
#define k15 keyl+1,1
#define k16 keyl+1,0
#define k17 keyl+2,7
#define k18 keyl+2,6
#define k19 keyl+2,5
#define k20 keyl+2,4
#define k21 keyl+2,3
#define k22 keyl+2,2
#define k23 keyl+2,1
#define k24 keyl+2,0
#define k25 keyl+3,7
#define k26 keyl+3,6
#define k27 keyl+3,5
#define k28 keyl+3,4

#define k29 keyr+0,7
#define k30 keyr+0,6
#define k31 keyr+0,5
#define k32 keyr+0,4
#define k33 keyr+0,3
#define k34 keyr+0,2
#define k35 keyr+0,1
#define k36 keyr+0,0
#define k37 keyr+1,7
#define k38 keyr+1,6
#define k39 keyr+1,5
#define k40 keyr+1,4
#define k41 keyr+1,3
#define k42 keyr+1,2
#define k43 keyr+1,1
#define k44 keyr+1,0
#define k45 keyr+2,7
#define k46 keyr+2,6
#define k47 keyr+2,5
#define k48 keyr+2,4
#define k49 keyr+2,3
#define k50 keyr+2,2
#define k51 keyr+2,1
#define k52 keyr+2,0
#define k53 keyr+3,7
#define k54 keyr+3,6
#define k55 keyr+3,5
#define k56 keyr+3,4

#define r01 right+0,7
#define r02 right+0,6
#define r03 right+0,5
#define r04 right+0,4
#define r05 right+0,3
#define r06 right+0,2
#define r07 right+0,1
#define r08 right+0,0
#define r09 right+1,7
#define r10 right+1,6
#define r11 right+1,5
#define r12 right+1,4
#define r13 right+1,3
#define r14 right+1,2
#define r15 right+1,1
#define r16 right+1,0
#define r17 right+2,7
#define r18 right+2,6
#define r19 right+2,5
#define r20 right+2,4
#define r21 right+2,3
#define r22 right+2,2
#define r23 right+2,1
#define r24 right+2,0
#define r25 right+3,7
#define r26 right+3,6
#define r27 right+3,5
#define r28 right+3,4
#define r29 right+3,3
#define r30 right+3,2
#define r31 right+3,1
#define r32 right+3,0

#define nr01 newr+0,7
#define nr02 newr+0,6
#define nr03 newr+0,5
#define nr04 newr+0,4
#define nr05 newr+0,3
#define nr06 newr+0,2
#define nr07 newr+0,1
#define nr08 newr+0,0
#define nr09 newr+1,7
#define nr10 newr+1,6
#define nr11 newr+1,5
#define nr12 newr+1,4
#define nr13 newr+1,3
#define nr14 newr+1,2
#define nr15 newr+1,1
#define nr16 newr+1,0
#define nr17 newr+2,7
#define nr18 newr+2,6
#define nr19 newr+2,5
#define nr20 newr+2,4
#define nr21 newr+2,3
#define nr22 newr+2,2
#define nr23 newr+2,1
#define nr24 newr+2,0
#define nr25 newr+3,7
#define nr26 newr+3,6
#define nr27 newr+3,5
#define nr28 newr+3,4
#define nr29 newr+3,3
#define nr30 newr+3,2
#define nr31 newr+3,1
#define nr32 newr+3,0

        endif


;-----------------------------------------------------------------------------
; setkey: permute key
; on entry:
;   FSR points to (unpermuted) key
; on exit:
;   permuted key is in keyl:keyr
;   FSR is unchanged
;-----------------------------------------------------------------------------

setkey:	movlw	8
	movwf	temp

setkey0:
        rlf     INDF
	rrf	keyl+0
        rlf     INDF
	rrf	keyl+1
        rlf     INDF
	rrf	keyl+2
        rlf     INDF
	rrf	keyl+3
        rlf     INDF
	rrf	keyr+2
        rlf     INDF
	rrf	keyr+1
        rlf     INDF
	rrf	keyr+0

        incf    FSR
	decfsz	temp
	goto	setkey0

        swapf   keyl+3,W        ; move low 4 bits of keyl+3
	movwf	keyr+3		;   into high 4 bits of keyr+3

	movlw	0f0h		; mask off extra bits
	andwf	keyl+3
	andwf	keyr+3

        movlw   -8              ; restore FSR to original value
        addlw   FSR

	return



;-----------------------------------------------------------------------------
; initial permutation
;
; on entry:
;   data pointed to by FSR
; on exit:
;   permuted data in left:right
;   FSR unchanged
;   input data unchanged
;-----------------------------------------------------------------------------

ip:	movlw	8
	movwf	temp

ip0:    rrf     INDF
	rrf	left+3
        rrf     INDF
	rrf	left+7
        rrf     INDF
	rrf	left+2
        rrf     INDF
	rrf	left+6
        rrf     INDF
	rrf	left+1
        rrf     INDF
	rrf	left+5
        rrf     INDF
	rrf	left+0
        rrf     INDF
	rrf	left+4

        incf    FSR
	decfsz	temp
	goto	ip0

        movlw   -8              ; restore FSR to original value
        addlw   FSR

	return


;-----------------------------------------------------------------------------
; inverse initial permutation

; on entry:
;   data in left:right
;   pointer to storage for permuted data output pointed to by FSR
; on exit:
;   permuted data output in buffer pointed to by FSR
;   FSR unchanged
;   input data unchanged
;-----------------------------------------------------------------------------

ipinv:
	movlw	8
	movwf	temp

ipinv0:
	rrf	left+3
        rrf     INDF
	rrf	left+7
        rrf     INDF
	rrf	left+2
        rrf     INDF
	rrf	left+6
        rrf     INDF
	rrf	left+1
        rrf     INDF
	rrf	left+5
        rrf     INDF
	rrf	left+0
        rrf     INDF
	rrf	left+4
        rrf     INDF

        incf    FSR
	decfsz	temp
	goto	ipinv0

        movlw   -8              ; restore FSR to original value
        addlw   FSR

	return


;-----------------------------------------------------------------------------
; core of DES
;-----------------------------------------------------------------------------

; The descore and desinvcore subroutines do complete DES encryptions and
; decryptions less the initial permutation and inverse initial permutation.
; The permutations are omitted here because in a triple-DES, it is a waste
; of time to apply them to the intermediate stages.


; On entry:
;   plaintext in left:right
;   permuted key in keyl:keyr
; On exit:
;   ciphertext in left:right

;                             call =    2 cycles
;   4 calls to roundl @ 320 cycles = 1280 cycles
; 12 calls to roundl2 @ 338 cycles = 4056 cycles
;                 fall into swaplr =   18 cycles
;                                    -----------
;                            total = 5356 cycles

descore:
	call	roundl		; round 1
	call	roundl		; round 2
	call	roundl2		; round 3
	call	roundl2		; round 4
	call	roundl2		; round 5
	call	roundl2		; round 6
	call	roundl2		; round 7
	call	roundl2		; round 8
	call	roundl		; round 9
	call	roundl2		; round 10
	call	roundl2		; round 11
	call	roundl2		; round 12
	call	roundl2		; round 13
	call	roundl2		; round 14
	call	roundl2		; round 15
	call	roundl		; round 16

; swaplr = 20 cycles including call
swaplr:
        movf    left+0,W
	movwf	right+0
        movf    left+1,W
	movwf	right+1
        movf    left+2,W
	movwf	right+2
        movf    left+3,W
	movwf	right+3

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

	return


; On entry:
;   ciphertext in left:right

⌨️ 快捷键说明

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