📄 desasm.asm
字号:
DB 15
DB 06
DB 08
DB 00
DB 05
DB 09
DB 02
DB 06
DB 11
DB 13
DB 08
DB 01
DB 04
DB 10
DB 07
DB 09
DB 05
DB 00
DB 15
DB 14
DB 02
DB 03
DB 12
DES_S8:
DB 13
DB 02
DB 08
DB 04
DB 06
DB 15
DB 11
DB 01
DB 10
DB 09
DB 03
DB 14
DB 05
DB 00
DB 12
DB 07
DB 01
DB 15
DB 13
DB 08
DB 10
DB 03
DB 07
DB 04
DB 12
DB 05
DB 06
DB 11
DB 00
DB 14
DB 09
DB 02
DB 07
DB 11
DB 04
DB 01
DB 09
DB 12
DB 14
DB 02
DB 00
DB 06
DB 10
DB 13
DB 15
DB 03
DB 05
DB 08
DB 02
DB 01
DB 14
DB 07
DB 04
DB 10
DB 08
DB 13
DB 15
DB 12
DB 09
DB 00
DB 03
DB 05
DB 06
DB 11
DES_P:
DB 16
DB 07
DB 20
DB 21
DB 29
DB 12
DB 28
DB 17
DB 01
DB 15
DB 23
DB 26
DB 05
DB 18
DB 31
DB 10
DB 02
DB 08
DB 24
DB 14
DB 32
DB 27
DB 03
DB 09
DB 19
DB 13
DB 30
DB 06
DB 22
DB 11
DB 04
DB 25
BIT_MASK:
DB 0x80
DB 0x40
DB 0x20
DB 0x10
DB 0x08
DB 0x04
DB 0x02
DB 0x01
KEY_IDX:
DB 0
DB 6
DB 12
DB 18
DB 24
DB 30
DB 36
DB 42
DB 48
DB 54
DB 60
DB 66
DB 72
DB 78
DB 84
DB 90
Perm_PC1:
LDY #0
PC1_1:
TYA ;Load Y conuter into A
LSR A ;Divide by 8
LSR A
LSR A
STA InpByte ;Store InputByte
LDA DES_PC1,y ;Get BitPos from permutation table
DEC A
STA BitPos
LSR A ;Divide by 8
LSR A
LSR A
STA ByteNr ;Store ByteNr
LDA BitPos
AND #0x07 ;Get modulus 8
STA BitNr ;Store in BitNr
;Get bit from permutation data
CLC
LDX ByteNr
LDA KeyData,x
LDX BitNr
BIT BIT_MASK,x
BEQ PC1_2
SEC
PC1_2:
;Put bit into PermOut
LDX InpByte
ROL TmpBlk_1,x
INY
CPY #56
BNE PC1_1
RTS
Perm_PC2:
LDY #0
PC2_1:
TYA ;Load Y conuter into A
LSR A ;Divide by 8
LSR A
LSR A
STA InpByte ;Store InputByte
LDA DES_PC2,y ;Get BitPos from permutation table
DEC A
STA BitPos
LSR A ;Divide by 8
LSR A
LSR A
STA ByteNr ;Store ByteNr
LDA BitPos
AND #0x07 ;Get modulus 8
STA BitNr ;Store in BitNr
;Get bit from permutation data
CLC
LDX ByteNr
LDA TmpBlk_2,x
LDX BitNr
BIT BIT_MASK,x
BEQ PC2_2
SEC
PC2_2:
;Put bit into PermOut
LDX InpByte
ROL TmpBlk_3,x
INY
CPY #48
BNE PC2_1
RTS
Perm_IP:
LDY #0
IP_1:
TYA ;Load Y conuter into A
LSR A ;Divide by 8
LSR A
LSR A
STA InpByte ;Store InputByte
LDA DES_IP,y ;Get BitPos from permutation table
DEC A
STA BitPos
LSR A ;Divide by 8
LSR A
LSR A
STA ByteNr ;Store ByteNr
LDA BitPos
AND #0x07 ;Get modulus 8
STA BitNr ;Store in BitNr
;Get bit from permutation data
CLC
LDX ByteNr
LDA InpData,x
LDX BitNr
BIT BIT_MASK,x
BEQ IP_2
SEC
IP_2:
;Put bit into PermOut
LDX InpByte
ROL TmpBlk_2,x
INY
CPY #64
BNE IP_1
RTS
Perm_E:
LDY #0
E_1:
TYA ;Load Y conuter into A
LSR A ;Divide by 8
LSR A
LSR A
STA InpByte ;Store InputByte
LDA DES_E,y ;Get BitPos from permutation table
DEC A
STA BitPos
LSR A ;Divide by 8
LSR A
LSR A
STA ByteNr ;Store ByteNr
LDA BitPos
AND #0x07 ;Get modulus 8
STA BitNr ;Store in BitNr
;Get bit from permutation data
CLC
LDX ByteNr
LDA TmpBlk_2+4,x
LDX BitNr
BIT BIT_MASK,x
BEQ E_2
SEC
E_2:
;Put bit into PermOut
LDX InpByte
ROL TmpBlk_3,x
INY
CPY #48
BNE E_1
RTS
Perm_P:
LDY #0
P_1:
TYA ;Load Y conuter into A
LSR A ;Divide by 8
LSR A
LSR A
STA InpByte ;Store InputByte
LDA DES_P,y ;Get BitPos from permutation table
DEC A
STA BitPos
LSR A ;Divide by 8
LSR A
LSR A
STA ByteNr ;Store ByteNr
LDA BitPos
AND #0x07 ;Get modulus 8
STA BitNr ;Store in BitNr
;Get bit from permutation data
CLC
LDX ByteNr
LDA TmpBlk_1+4,x
LDX BitNr
BIT BIT_MASK,x
BEQ P_2
SEC
P_2:
;Put bit into PermOut
LDX InpByte
ROL TmpBlk_2+4,x
INY
CPY #32
BNE P_1
RTS
Perm_FP:
LDY #0
FP_1:
TYA ;Load Y conuter into A
LSR A ;Divide by 8
LSR A
LSR A
STA InpByte ;Store InputByte
LDA DES_FP,y ;Get BitPos from permutation table
DEC A
STA BitPos
LSR A ;Divide by 8
LSR A
LSR A
STA ByteNr ;Store ByteNr
LDA BitPos
AND #0x07 ;Get modulus 8
STA BitNr ;Store in BitNr
;Get bit from permutation data
CLC
LDX ByteNr
LDA TmpBlk_1,x
LDX BitNr
BIT BIT_MASK,x
BEQ FP_2
SEC
FP_2:
;Put bit into PermOut
LDX InpByte
ROL OutData,x
INY
CPY #64
BNE FP_1
RTS
Init_C0_D0:
LDA TmpBlk_1+6
STA TmpBlk_1+7
LDA TmpBlk_1+5
STA TmpBlk_1+6
LDA TmpBlk_1+4
STA TmpBlk_1+5
LDA TmpBlk_1+3
AND #0x0F
STA TmpBlk_1+4
LDA TmpBlk_1+3
AND #0xF0
STA TmpBlk_1+3
RTS
Shift_Cx_Dx:
;Rotate Cx
STZ KeyNr
NEXT_KEY:
LDY KeyNr
LDX DES_KEYROOT,y
?1
CLC
ROL TmpBlk_1+3
ROL TmpBlk_1+2
ROL TmpBlk_1+1
ROL TmpBlk_1+0
BCC ?2
LDA TmpBlk_1+3
ORA #0x10
AND #0xF0
STA TmpBlk_1+3
?2
;Rotate Dx
CLC
ROL TmpBlk_1+7
ROL TmpBlk_1+6
ROL TmpBlk_1+5
ROL TmpBlk_1+4
DEX
BNE ?1
;OR the nibble back inte right alligned byte
LDA TmpBlk_1+4
LSR A
LSR A
LSR A
LSR A
ORA TmpBlk_1+7
STA TmpBlk_1+7
LDA TmpBlk_1+4
AND #0x0F
STA TmpBlk_1+4
;Build CxDx
LDA TmpBlk_1+0
STA TmpBlk_2+0
LDA TmpBlk_1+1
STA TmpBlk_2+1
LDA TmpBlk_1+2
STA TmpBlk_2+2
LDA TmpBlk_1+3
ORA TmpBlk_1+4
STA TmpBlk_2+3
LDA TmpBlk_1+5
STA TmpBlk_2+4
LDA TmpBlk_1+6
STA TmpBlk_2+5
LDA TmpBlk_1+7
STA TmpBlk_2+6
JSR Perm_PC2
;Store Subkey
LDY KeyNr
LDX KEY_IDX,y
LDA TmpBlk_3+0
STA SubKeys+0,x
LDA TmpBlk_3+1
STA SubKeys+1,x
LDA TmpBlk_3+2
STA SubKeys+2,x
LDA TmpBlk_3+3
STA SubKeys+3,x
LDA TmpBlk_3+4
STA SubKeys+4,x
LDA TmpBlk_3+5
STA SubKeys+5,x
;LDA TmpBlk_3+6
;STA SubKeys+6,x
;LDA TmpBlk_3+7
;STA SubKeys+7,x
INC KeyNr
LDA KeyNr
CMP #16
BEQ KEYS_FINISHED
JMP NEXT_KEY
KEYS_FINISHED:
RTS
GetSboxIndex:
AND #0x21
CMP #0x21
BEQ ROW_3
CMP #0x20
BEQ ROW_2
CMP #0x01
BEQ ROW_1
ROW_0:
STZ ByteNr
BRA COLUMN
ROW_1:
LDA #0x10
STA ByteNr
BRA COLUMN
ROW_2:
LDA #0x20
STA ByteNr
BRA COLUMN
ROW_3:
LDA #0x30
STA ByteNr
COLUMN:
LDA Bn
LSR A
AND #0x0F
ORA ByteNr
TAY
RTS
Calc_Lx_Rx:
;Build Lx=R(n-1) in TmpBlk_1 0->3
LDA TmpBlk_2+4
STA TmpBlk_1+0
LDA TmpBlk_2+5
STA TmpBlk_1+1
LDA TmpBlk_2+6
STA TmpBlk_1+2
LDA TmpBlk_2+7
STA TmpBlk_1+3
;Perm E of R(x)
JSR Perm_E
;XOR E(Rx) and Kx
LDY KeyNr
LDX KEY_IDX,y
LDA SubKeys+0,x
EOR TmpBlk_3+0
STA TmpBlk_3+0
LDA SubKeys+1,x
EOR TmpBlk_3+1
STA TmpBlk_3+1
LDA SubKeys+2,x
EOR TmpBlk_3+2
STA TmpBlk_3+2
LDA SubKeys+3,x
EOR TmpBlk_3+3
STA TmpBlk_3+3
LDA SubKeys+4,x
EOR TmpBlk_3+4
STA TmpBlk_3+4
LDA SubKeys+5,x
EOR TmpBlk_3+5
STA TmpBlk_3+5
;Calc S-Boxes
;S-Box 1
LDA TmpBlk_3+0
LSR A
LSR A
STA Bn ;B(1)
JSR GetSboxIndex
LDA DES_S1,y
ASL A
ASL A
ASL A
ASL A
STA TmpBlk_1+4
;S-Box 2
LDA TmpBlk_3+0
ASL A
ASL A
ASL A
ASL A
STA Bn ;B(2)
LDA TmpBlk_3+1
LSR A
LSR A
LSR A
LSR A
ORA Bn
STA Bn
JSR GetSboxIndex
LDA DES_S2,y
ORA TmpBlk_1+4
STA TmpBlk_1+4
;S-Box 3
LDA TmpBlk_3+1
ASL A
ASL A
STA Bn ;B(3)
LDA TmpBlk_3+2
LSR A
LSR A
LSR A
LSR A
LSR A
LSR A
ORA Bn
AND #0x3F
STA Bn
JSR GetSboxIndex
LDA DES_S3,y
ASL A
ASL A
ASL A
ASL A
STA TmpBlk_1+5
;S-Box 4
LDA TmpBlk_3+2
AND #0x3F
STA Bn ;B(4)
JSR GetSboxIndex
LDA DES_S4,y
ORA TmpBlk_1+5
STA TmpBlk_1+5
;S-Box 5
LDA TmpBlk_3+3
LSR A
LSR A
STA Bn ;B(5)
JSR GetSboxIndex
LDA DES_S5,y
ASL A
ASL A
ASL A
ASL A
STA TmpBlk_1+6
;S-Box 6
LDA TmpBlk_3+3
ASL A
ASL A
ASL A
ASL A
STA Bn ;B(6)
LDA TmpBlk_3+4
LSR A
LSR A
LSR A
LSR A
ORA Bn
STA Bn
JSR GetSboxIndex
LDA DES_S6,y
ORA TmpBlk_1+6
STA TmpBlk_1+6
;S-Box 7
LDA TmpBlk_3+4
ASL A
ASL A
STA Bn ;B(7)
LDA TmpBlk_3+5
LSR A
LSR A
LSR A
LSR A
LSR A
LSR A
ORA Bn
AND #0x3F
STA Bn
JSR GetSboxIndex
LDA DES_S7,y
ASL A
ASL A
ASL A
ASL A
STA TmpBlk_1+7
;S-Box 8
LDA TmpBlk_3+5
AND #0x3F
STA Bn ;B(8)
JSR GetSboxIndex
LDA DES_S8,y
ORA TmpBlk_1+7
STA TmpBlk_1+7
JSR Perm_P ;Rx will be in TmpBlk_2 4->7
;XOR Rx with L0
LDA TmpBlk_2+0
EOR TmpBlk_2+4
STA TmpBlk_2+4
LDA TmpBlk_2+1
EOR TmpBlk_2+5
STA TmpBlk_2+5
LDA TmpBlk_2+2
EOR TmpBlk_2+6
STA TmpBlk_2+6
LDA TmpBlk_2+3
EOR TmpBlk_2+7
STA TmpBlk_2+7
;Move Lx to TmpBlk_2 0->3
LDA TmpBlk_1+0
STA TmpBlk_2+0
LDA TmpBlk_1+1
STA TmpBlk_2+1
LDA TmpBlk_1+2
STA TmpBlk_2+2
LDA TmpBlk_1+3
STA TmpBlk_2+3
RTS
Reverse_LxRx:
LDA TmpBlk_2+4
STA TmpBlk_1+0
LDA TmpBlk_2+5
STA TmpBlk_1+1
LDA TmpBlk_2+6
STA TmpBlk_1+2
LDA TmpBlk_2+7
STA TmpBlk_1+3
LDA TmpBlk_2+0
STA TmpBlk_1+4
LDA TmpBlk_2+1
STA TmpBlk_1+5
LDA TmpBlk_2+2
STA TmpBlk_1+6
LDA TmpBlk_2+3
STA TmpBlk_1+7
RTS
KeySetup:
PHX
JSR Perm_PC1
JSR Init_C0_D0
JSR Shift_Cx_Dx
PLX
RTS
DeleteKey
PHX
LDX #150
CLEAR_KEY_LOOP:
STZ KeyData-1,x
DEX
BNE CLEAR_KEY_LOOP
PLX
RTS
DESxor
PHX
LDX #8
XOR_LOOP:
LDA OutData-1,x
EOR InpData-1,x
STA InpData-1,x
DEX
BNE XOR_LOOP
PLX
RTS
DESencrypt
PHX
JSR Perm_IP
STZ KeyNr
DES_ROUND_1:
JSR Calc_Lx_Rx
INC KeyNr
LDA KeyNr
CMP #16
BNE DES_ROUND_1
JSR Reverse_LxRx
JSR Perm_FP
PLX
RTS
DESdecrypt
PHX
JSR Perm_IP
LDA #15
STA KeyNr
DES_ROUND_2:
JSR Calc_Lx_Rx
DEC KeyNr
LDA KeyNr
CMP #255
BNE DES_ROUND_2
JSR Reverse_LxRx
JSR Perm_FP
PLX
RTS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -