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

📄 des.asm

📁 C51下把DES汇编改为C语言的程序.改进版程序.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;****************************************************************************
; void DES(char mode, char data *text,char xdata *key)
;                R7,            R5,            R2,R3
;        MOV     R7,A
;        MOV     R5,#LOW text?12
;        MOV     R2,#HIGH key
;        MOV     R3,#LOW key
;        LCALL   _DES
;****************************************************************************
;extrn    IData (CalcArea)
extrn    Data  (BM0)
extrn    Data  (BM1)
extrn    Data  (BM2)
extrn    Data  (BM3)
extrn    Data  (BM4)
extrn    Data  (BM5)
extrn    Data  (BM6)
extrn    Data  (BM7)

public   _DES
;**** Definitions ****
         Decode      equ  Acc.5      ;Decode-/Encode~-Flag
         MAC         equ  Acc.4      ;MAC-Flag

DES_Proc  segment code
?ID?XADES SEGMENT IDATA

R2MAC:    ;Error messages
LenErr:
ModeErr:
rseg     ?ID?XADES
CalcArea:       DS     16

rseg     DES_Proc
_DES:
   Mov    A, R7
   Xch    A, R5
   Mov    R7,#08h
   Xch    A, R1
;********** Function DES **********

           ;R0    O     Pointer, general purpose,       output = R1+R7 (BuildMac)
           ;R1   I/O    Pointer to 8-byte input data,   output = R2+8
           ;R2          Pointer to 8-byte working area for D-, C-Values
           ;R3    O     RoundCounter,                   output = 8
           ;R4          Counter, general purpose
           ;R5    I,  u Parameter P2 of APDU
           ;    b7b6
           ;     0 0    ECB
           ;     0 1    CBC
           ;     1 x    reserved
           ;        b5
           ;         0  encrypt
           ;         1  decrypt
           ;          b4
           ;          1 build MAC
           ;R6          InputPointer
           ;R7    I     ByteCount
           ;B           TestRegister for Shift1Test of D-, C-Values
           ;Dptr  I   u Pointer to 64/56-bit DES-Key in TLV-Format
           ;Carry O     0 = Normal Termination
           ;Abbreviations: I = Input, O = Output, u = unchanged
           ;Two Stack-Entries neccessary
           ;Key format:         sequence of TLV records
           ;  1st record:       key handling information
           ;  2nd record:       DES key
           ;  3rd record:       initial value (optional)

            Mov         A,    R5        ;Mode
            Jnb         MAC,DES_
            Jnb         Decode,DES_
        ;separate MAC at the end of datafield
            Mov         A,    R7        ;Acc      := #(Data) + #(MAC)
            Add         A,   #0F8h      ;Acc      -= #(MAC)
            Mov         R7,   A         ;R7       := true DataLength
DES_:
            Mov         DPH, R2
            Mov         DPL, R3
            Mov         R3,  #8         ;D, C     := PC_1 (DES-Key), 2*28 bit
        ;calculate key address (adrC = dptr+R2)
        
             MOV        R2,  #00H
;            Mov         A,   #1
;            MovC        A, @A+Dptr      ;Acc      := HeaderLength
;            Add         A,   #4         ;Acc      := addr (Key0)
;            Mov         R2,   A         ;R2       := KeyByteOffset
        ;address of 16 bytes calculation area
            Mov         A,   #CalcArea  ;Acc      := addr
            Xch         A,    R1        ;Acc      := addr (Input0)
            Mov         R6,   A         ;R6       := addr (Input0)
        ;write permuted key to bitmap area
DesGetKey:  Mov         R0,  #BM0       ;R0       := addr (C0)
            Mov         A,    R2        ;Acc      := KeyByteOffset

;           MovC        A, @A+Dptr      ;Acc      := ith byte of DES-Key
 	    lcall       GetKey

            Inc         R2
            Mov         R4,  #7         ;R4       := shift bits 6..0, bit 7 not used
            Rlc         A
            Xch         A,   @R0
            Rlc         A
            Xch         A,   @R0
            Inc         R0
            Djnz        R4, $-5
            Djnz        R3, DesGetKey

            Mov         A,    BM6       ;Acc      := D0
            Xch         A,    BM4       ;Acc      := D2
            Mov         BM6,  A         ;Store D2 at correct location
        ;2nd permutation and copy to calculation area
            Mov         R0,  #BM0       ;R0       := addr (C0)
            Mov         R3,  #7         ;R3       := permutate 7 bytes

SetKeyNxt:  Mov         A,    R3        ;Acc      := addr (D6, C6) - R1 + 1
            Mov         R4,   A         ;R4       := ByteCounter
            Mov         A,   @R0        ;Acc      := next StandardPermutationByte
            Inc         R0
            Rrc         A
            Xch         A,   @R1
            Rrc         A
            Rrc         A
            Xch         A,   @R1
            Inc         R1
            Djnz        R4, $-6         ;R1 == addr (D6, C6) +1 ?

            Mov         R4,   A         ;Save Accu
            Mov         A,    R1        ;Acc      := addr (D6, C6) + 1
            Add         A,   #0F9h      ;Acc      := addr (D0, C0)
            Mov         R1,   A         ;R1       := addr (D0, C0)
            Clr         C
            Mov         A,   #8         ;Acc      := all bits
            SubB        A,    R3        ;Acc      := remaining bits to shift
            Xch         A,    R4        ;Acc      := remaining bits
            Rrc         A
            Xch         A,   @R1
            Rrc         A
            Rrc         A
            Xch         A,   @R1
            Inc         R1
            Djnz        R4, $-6         ;More bits to shift   ?
            Djnz        R3, SetKeyNxt   ;All bytes permutated ?

	    CLR 	C
	    MOV        R3,#08h
;           Call        VecExist        ;initial value to copy?
                                        ;C = 1: yes
                                        ;  = 0: no
                                        ;R3 = #8
        ;copy 0 or initial value to calculation area
            Inc         R2              ;R2       := addr (Vector0) - 1
            Clr         A

            Jnc         $+5
            Inc         R2
            Mov         A,    R2        ;Acc      := addr (VectorI)
            MovC        A, @A+Dptr      ;Acc      := VectorI
            
            Inc         R1              ;addr (O) += 1
            Mov         @R1,  A
            Djnz        R3, $-7

            Mov         A,    R1        ;Acc      := addr (Output7)
            Add         A,   #0F1h      ;Acc      := addr (D0, C0)
            Mov         R2,   A         ;R2       := addr (D0, C0)

        ;Check DES mode
            Mov         A,    R5        ;Acc      := mode
            Jnb         Acc.7,DesModeOk
            Call        GErrCrypt       ;Error: wrong mode
            DB          003h

DesModeOk:  Cpl         Decode
            Mov         R5,   A
            Anl         A,   #030h      ;Mask Decode and MAC-Bit
            Jnz         DesLgOk         ;no len check when MAC or encrypt
            Mov         A,    R7        ;Get ByteCount
            Anl         A,   #007h      ;James Bond
            Jz          DesLgOk
            Call        GErrCrypt       ;Error: Length not multiple of 8
            DB          008h

DesLgOk:    Mov         A,    R5        ;Acc      := mode
            Xrl         A,   #040h      ;CBC-Decode
            Anl         A,   #0F0h
            Jnz         DesSave         ;No CBC-Decode ?
                                        ;CBC-Decode starts at end of data
            Mov         A,    R6        ;Acc      := addr (Block0)
            Add         A,    R7        ;Acc      := addr (BlockN) + 8
            Add         A,   #0F8h      ;Acc      := addr (BlockN)
            Mov         R6,   A         ;R6       := addr (BlockN)

DesSave:    Push        Dpl
            Push        Dph


;********** Function DES **********

DESAction:  Mov         R3,  #8         ;Initial permutation IP of 8 bytes
            Mov         A,    R2        ;Acc      := addr (D0, C0)
            Add         A,    R3        ;Acc      := addr (Output0)
            Mov         R1,   A         ;R1       := addr (Output0)
            Mov         A,    R5        ;Acc      := Mode
            Mov         B,    A         ;B-Accu   := Mode
            Rl          A
            Rlc         A               ;Carry    := R5.6
            Anl         C,    Acc.7     ;CBC-Encode  => Carry = 1 !
            Orl         C,    Acc.6     ;BuildMac    => Carry = 1 !
            Mov         0F0h, C         ;B.0 = 1     => ExOr InputData

        ;get 8 bytes of data/add padding bytes
InitPerm:   Mov         R2,  #080h      ;Padding value
            Mov         A,    R7
            Jz          Padding
            Dec         R7              ;ByteCounter
            Mov         A,    R6        ;Acc      := addr (InputI)
            Mov         R0,   A         ;R0       := addr (InputI)
            Mov         A,   @R0        ;Acc      := InputI
            SJmp        $+6
Padding:    Xch         A,    R2        ;Acc      := PaddingByte
            Jb          0F4h, $+7       ;BuildMac ?  => Skip Increment
            Inc         R6              ;addr (I) += 1
        ;add previous output if necessary
            Jnb         0F0h, $+4
            Xrl         A,   @R1        ;Acc      ^= OutputI
            Mov         R0,  #BM0       ;R0       := addr (Work0), it contains Right0
            Mov         R4,  #8         ;R4       := shift 8 bits
            Djnz        R3, $+4
            SJmp        InitEnd
        ;permute byte into bitmap area
            Inc         R1              ;addr (O) += 1
            Rlc         A
            Xch         A,   @R0
            Rlc         A
            Xch         A,   @R0
            Inc         R0              ;addr (W) += 1
            Djnz        R4, $-5
            SJmp        InitPerm+2
        ;permute last byte
InitEnd:    Rl          A
            Rl          A
            Rlc         A
            Xch         A,   @R0
            Rl          A
            Rrc         A
            Xch         A,   @R0
            Inc         R0              ;addr (W) += 1
            Djnz        R4, $-6

        ;load permuted input in calculation area
            Mov         @R1,  BM1       ;R1       := addr (Left0)
            Dec         R1              ;R1       := addr (Left1)
            Mov         @R1,  BM3
            Dec         R1              ;R1       := addr (Left2)
            Mov         @R1,  BM5
            Dec         R1              ;R1       := addr (Left3)
            Mov         @R1,  BM7
            Dec         R1              ;R1       := addr (Right0)
            Mov         @R1,  BM0
            Dec         R1              ;R1       := addr (Right1)
            Mov         @R1,  BM2
            Dec         R1              ;R1       := addr (Right2)
            Mov         @R1,  BM4
            Dec         R1              ;R1       := addr (Right3)
            Mov         @R1,  BM6

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -