PIC单片机滚动码的解码程序
扫描二维码
随时随地手机看文章
#include <p16f877.inc>
;
global decrypt
global key0,key1,key2,key3,key4,key5,key6,key7
global csr0,csr1,csr2,csr3,csr4,csr5,csr6,csr7,csr8
;
#define hop1 csr0 ; ﹚竡 hop1~4 单? csr1~4
#define hop2 csr1
#define hop3 csr2
#define hop4 csr3
#define max_code_length .72
#define code_length .66
;
udata_shr ; difine csr0:csr7 on share memory
csr0 res 1 ; hopping code 钡μ?纗??既?竟 (lsb)
csr1 res 1
csr2 res 1
csr3 res 1
csr4 res 1
csr5 res 1
csr6 res 1
csr7 res 1
csr8 res 1 ; hopping code 钡μ?纗??既?竟 (msb)
;
encrypt_data udata 0x20
key0 res 1 ; 64-bit 秆盞じン戈? (lsb)
key1 res 1
key2 res 1
key3 res 1
key4 res 1
key5 res 1
key6 res 1
key7 res 1
;
udata
cnt0 res 1
cnt1 res 1
hop_length res 1
mask res 1
keeloq_temp res 1
;
;
keeloq_code code
;
;*****************************************************
;**** rotate csrs register right 1 bit
;*****************************************************
rot_csrs
rrf csr8,f
rrf csr7,f
rrf csr6,f
rrf csr5,f
rrf csr4,f
rrf csr3,f
rrf csr2,f
rrf csr1,f
rrf csr0,f
return
;
;
;
;
;****************************************************************
;
; function : decrypt ()
;
; description : decrypts 32 bit [hop1:hop4] using [csr0:csr7]
;
;****************************************************************
decrypt
banksel cnt1
movlw (.11+1) ; outer loop 11+1 times
movwf cnt1 ; outer loop 11+1 times
decrypt_outer
movlw .48 ; inner loop 48 times
movwf cnt0 ; inner loop 48 times
decrypt_inner
clrwdt ; reset watchdog timer
movfw cnt1 ; last 48 loops restore the key
xorlw .1 ; last 48 loops restore the key
btfsc status,z ; last 48 loops restore the key
goto rotate_key ; last 48 loops restore the key
; the lookup table is compressed into in 4 bytes to save space
; use the 3 low index bits to make up an 8-bit bit mask
; use the 2 high index bits to look up the value in the table
; use the bit mask to isolate the correct bit in the byte
; part of the reason for this scheme is because normal table
; lookup requires an additional stack level
bcf status,c ; clear carry (for the left shift)
movlw .1 ; initialise mask = 1
btfsc hop3,3 ; shift mask 4x if bit 2 set
movlw b"00010000" ; shift mask 4x if bit 2 set
movwf mask ; initialise mask = 1
btfss hop2,0 ; shift mask another 2x if bit 1 set
goto $+3
rlf mask,f
rlf mask,f
btfsc hop1,0 ; shift mask another 1x if bit 0 set
rlf mask,f
; mask has now been shifted 0-7 times according to bits 2:1:0
movlw high table
movwf pclath
movlw low table
movwf keeloq_temp
movlw 0 ; table index = 0
btfsc hop4,1
iorlw .2 ; if bit 3 set add 2 to the table index
btfsc hop4,6
iorlw .4 ; if bit 4 set add 4 to the table index
addwf keeloq_temp,w
btfsc status,c
incf pclath,f
movwf pcl ; add the index to the program counter
; [ must be in lower half of page ]
table
movlw 0x2e ; bits 4:3 were 00
goto table_end ; end of lookup
movlw 0x74 ; bits 4:3 were 01
goto table_end ; end of lookup
movlw 0x5c ; bits 4:3 were 10
goto table_end ; end of lookup
movlw 0x3a ; bits 4:3 were 11
table_end
andwf mask,1 ; isolate the correct bit
movlw 0 ; copy the bit to bit 7
btfss status,z ; copy the bit to bit 7
movlw b"1000