desasm.asm

来自「国外牛人写的des和3des算法」· 汇编 代码 · 共 1,555 行 · 第 1/2 页

ASM
1,555
字号
        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 + =
减小字号Ctrl + -
显示快捷键?