📄 des.asm
字号:
Mov C, BM3.5 ;P(B)19 := B14
Rrc A
Mov C, BM7.7 ;P(B)20 := B32
Rrc A
Mov C, BM6.2 ;P(B)21 := B27
Rrc A
Mov C, BM0.2 ;P(B)22 := B3
Rrc A
Mov C, BM2.0 ;P(B)23 := B9
Rrc A
Mov C, BM4.2 ;P(B)24 := B19
Rrc A
Dec R1
Xrl A, @R1 ;Acc := new Right2
Mov @R1, A ;Left2 := new Right2
Mov C, BM3.4 ;P(B)25 := B13
Rrc A
Mov C, BM7.5 ;P(B)26 := B30
Rrc A
Mov C, BM1.5 ;P(B)27 := B6
Rrc A
Mov C, BM5.5 ;P(B)28 := B22
Rrc A
Mov C, BM2.2 ;P(B)29 := B11
Rrc A
Mov C, BM0.3 ;P(B)30 := B4
Rrc A
Mov C, BM6.0 ;P(B)31 := B25
Rrc A
Mov C, BM3.7 ;P(B)32 := B16
Rrc A
Dec R1
Xrl A, @R1 ;Acc := new Right3
Mov @R1, A ;Left3 := new Right3
Mov A, R3 ;Acc := RoundCounter
Jz PreOutput ;Ready Rounds ?
Jmp OneRound ;Next Round !
;Normalize output of 16 rounds
PreOutput: Mov BM7, @R1 ;BM7 := Right3
Inc R1
Mov BM5, @R1 ;BM5 := Right2
Inc R1
Mov BM3, @R1 ;BM3 := Right1
Inc R1
Mov BM1, @R1 ;BM1 := Right0
Inc R1
Mov BM6, @R1 ;BM6 := Left3
Inc R1
Mov BM4, @R1 ;BM4 := Left2
Inc R1
Mov BM2, @R1 ;BM2 := Left1
Inc R1
Mov BM0, @R1 ;BM0 := Left0
Mov R3, #8 ;Inverse initial permutation IP^-1
Mov R0, #BM0
InvItPerm: Mov A, @R0
Inc R0
Rl A ;Due to Left and Right notation
Mov R4, #8 ;which are rotated right 1 bit
Rrc A ;in comparision with Standard
Xch A, @R1
Rlc A
Xch A, @R1
Dec R1
Djnz R4, $-5
Mov A, R1 ;Acc := addr (Output0) - 1
Add A, #8 ;Acc := addr (Output7)
Mov R1, A ;R1 := addr (Output7)
Djnz R3, InvItPerm
Mov A, @R1 ;Acc := Output7 << 2
Rr A
Rr A
Mov @R1, A
;Result of DES operation available
Mov A, R6 ;Acc := addr (Input0) + 8
Mov R0, A ;R0 := addr (Input0) + 8
Clr C
Mov A, R5
Jb Acc.4, TestEnd ;BuildMac ?
Rl A
Rlc A
Anl C, /Acc.7 ;Carry := Mode is CBC decode
Mov R3, #8 ;Copy data to input location
Mov A, @R1 ;Acc := OutputI
Dec R1
Dec R0
Mov @R0, A
Djnz R3, $-4
TestEnd: Mov A, R7
Jz DesEnd ;End of input data reached?
Jnc NoCbcDec
Mov A, R6 ;For CBC decode set pointer to next block
Add A, #0F0h
Mov R6, A
Mov R1, A
Mov R3, #8 ;and XOR it with previous output
Mov A, @R1
Xrl A, @R0
Mov @R0, A
Inc R0
Inc R1
Djnz R3, $-5
NoCbcDec: LJmp DesAction
DesEnd: Pop Dph ;Restore DataPointer
Pop Dpl
Jnc DesRet
Call VecExist
Jnc DesRet
Mov A, #1 ;CBC decode only
; MovC A, @A+Dptr ;Acc := HeaderLength
lcall GetKey
Add A, #14 ;Acc := index (Vector0)
Mov R1, A
Mov A, R1
; MovC A, @A+Dptr ;Acc := VectorI
lcall GetKey
Inc R1
Xrl A, @R0
Mov @R0, A
Inc R0
Djnz R3, $-6
DesRet: Mov R3, #8
Mov A, R2 ;Acc := addr (D0, C0)
Add A, R3 ;Acc := addr (Output0)
Mov R1, A ;R1 := addr (Output0)
Mov A, R5 ;Acc := Mode
Jnb Acc.4,NoMAC
;MAC verification/copy MAC to end of data
Mov C, Acc.5
Mov A, @R1
Jc $+5
Xrl A, @R0
Jnz MacErr
Mov @R0, A
Inc R0
Inc R1
Djnz R3, $-9
NoMAC: Mov A, R6
Mov R1, A
Mov A, #8
Clr C
Ret ;Normal Termination => Carry == 0 !
MacErr: Call GErrCrypt ;Invalid MAC
DB R2MAC
VecExist: Mov A, #2
; MovC A, @A+Dptr ;Acc := KeyType
lcall GetKey
Rrc A ;Carry := InitialVectorExistance
Mov A, #1
; MovC A, @A+Dptr ;Acc := HeaderLength
lcall GetKey
; MovC A, @A+Dptr ;Acc := EntryCount
lcall GetKey
Dec A
Jnz $+3 ;EntryCount > 1 ?
Clr C ;EntryCount == 1 => C := 0
Mov R3, #8
Ret
GErrCrypt: Pop DPh
Pop DPl
Clr A
MovC A,@A+DPtr
GetKey: Push DPH
Push DPL
Add A, DPL
Mov DPL, A
Mov A, DPH
Addc A, #0h
Mov DPH, A
MovX A, @Dptr ;Acc := ith byte of DES-Key
Pop DPL
Pop DPH
ret
SBoxes: ;BoxNr.: 2,1 4,3 6,5 8,7
DB 0F7h,0E5h,034h,0B2h
DB 002h,05Bh,092h,0E8h
DB 09Ch,088h,001h,05Ch
DB 0AFh,0FDh,0EFh,005h
DB 064h,006h,09Eh,06Fh
DB 05Bh,031h,045h,093h
DB 03Ah,0DDh,07Bh,0AAh
DB 09Ch,0AAh,086h,0F0h
DB 01Bh,079h,052h,014h
DB 0E7h,092h,0F8h,02Dh
DB 046h,013h,0CCh,0C9h
DB 039h,0C4h,023h,056h
DB 0CDh,09Fh,06Dh,0D1h
DB 0B4h,0ECh,03Eh,07Eh
DB 0A0h,024h,0A7h,036h
DB 04Ah,017h,0D0h,0A9h
DB 082h,0B0h,083h,04Dh
DB 078h,066h,074h,0D2h
DB 0E5h,04Bh,0BAh,093h
DB 013h,088h,009h,06Fh
DB 0DFh,06Ch,045h,0F0h
DB 026h,0DFh,01Bh,03Ch
DB 009h,032h,0E0h,005h
DB 0C5h,045h,0BCh,0CAh
DB 078h,0C7h,0F8h,027h
DB 0D1h,009h,0ADh,08Bh
DB 0B3h,0AEh,02Fh,07Eh
DB 06Eh,073h,05Ah,0B1h
DB 021h,05Ah,016h,08Bh
DB 08Dh,0B0h,0C1h,047h
DB 05Eh,0F1h,0D9h,0E8h
DB 0F0h,02Eh,067h,014h
DB 0C0h,0BBh,057h,08Bh
DB 0BFh,0C8h,02Dh,046h
DB 035h,024h,06Ah,037h
DB 0DAh,092h,0D6h,0F9h
DB 0F7h,06Ch,0E2h,052h
DB 0C2h,056h,098h,028h
DB 069h,083h,00Ch,004h
DB 005h,03Dh,065h,0C7h
DB 02Eh,0D0h,024h,0BDh
DB 051h,00Bh,043h,07Bh
DB 083h,04Ah,0BFh,06Ah
DB 0ECh,0A7h,080h,090h
DB 01Bh,006h,09Bh,0E8h
DB 028h,0B1h,0F4h,015h
DB 0DCh,07Fh,0C1h,091h
DB 076h,044h,01Ah,06Ch
DB 0BFh,01Eh,0FDh,0F0h
DB 013h,0F5h,0C1h,08Dh
DB 006h,0E1h,080h,0ACh
DB 06Dh,02Fh,07Fh,03Ah
DB 044h,0F2h,03Eh,0C9h
DB 0F9h,089h,0A7h,052h
DB 09Ah,05Dh,0D9h,07Fh
DB 0A0h,0EAh,002h,0A4h
DB 0E2h,0A9h,043h,01Eh
DB 084h,060h,03Eh,0E1h
DB 05Dh,037h,075h,0D3h
DB 037h,0DCh,0E9h,00Fh
DB 078h,0C5h,0A8h,025h
DB 04Eh,01Eh,05Bh,0BEh
DB 0A1h,098h,016h,046h
DB 09Bh,073h,0BCh,0D3h
;********** End of DES ******
End
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -