⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 desasm.asm

📁 国外牛人写的des和3des算法
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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 + -