?? des.inc
字號:
;-----------------------------------------------------------------------------
; 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 + -