📄 des.asm
字号:
;
; DES masm source, written by drizz
;
.686
.XMM
.MODEL FLAT,STDCALL
DESSetKey PROTO pKey:PTR BYTE
DESSetKeyEnc PROTO pKey:PTR BYTE
DESSetKeyDec PROTO pKey:PTR BYTE
DESEncrypt PROTO pBlockIn:PTR BYTE,pBlockOut:PTR BYTE
DESDecrypt PROTO pBlockIn:PTR BYTE,pBlockOut:PTR BYTE
comment %
Usage example
.data
align 8
key db 043h, 029h, 07fh, 0adh, 038h, 0e3h, 073h, 0feh
Plaintext db 076h, 025h, 014h, 0b8h, 029h, 0bfh, 048h, 06ah
Ciphertext db 0eah, 067h, 06bh, 02ch, 0b7h, 0dbh, 02bh, 07ah
.code
invoke DESSetKeyEnc,offset key
invoke DESEncrypt,offset Plaintext,offset Plaintext
invoke DESSetKeyDec,offset key
invoke DESDecrypt,offset Plaintext,offset Plaintext
%
.data
align 16
Spbox label dword;[8][64]
dd 001010400h,000000000h,000010000h,001010404h,001010004h,000010404h,000000004h,000010000h
dd 000000400h,001010400h,001010404h,000000400h,001000404h,001010004h,001000000h,000000004h
dd 000000404h,001000400h,001000400h,000010400h,000010400h,001010000h,001010000h,001000404h
dd 000010004h,001000004h,001000004h,000010004h,000000000h,000000404h,000010404h,001000000h
dd 000010000h,001010404h,000000004h,001010000h,001010400h,001000000h,001000000h,000000400h
dd 001010004h,000010000h,000010400h,001000004h,000000400h,000000004h,001000404h,000010404h
dd 001010404h,000010004h,001010000h,001000404h,001000004h,000000404h,000010404h,001010400h
dd 000000404h,001000400h,001000400h,000000000h,000010004h,000010400h,000000000h,001010004h
dd 080108020h,080008000h,000008000h,000108020h,000100000h,000000020h,080100020h,080008020h
dd 080000020h,080108020h,080108000h,080000000h,080008000h,000100000h,000000020h,080100020h
dd 000108000h,000100020h,080008020h,000000000h,080000000h,000008000h,000108020h,080100000h
dd 000100020h,080000020h,000000000h,000108000h,000008020h,080108000h,080100000h,000008020h
dd 000000000h,000108020h,080100020h,000100000h,080008020h,080100000h,080108000h,000008000h
dd 080100000h,080008000h,000000020h,080108020h,000108020h,000000020h,000008000h,080000000h
dd 000008020h,080108000h,000100000h,080000020h,000100020h,080008020h,080000020h,000100020h
dd 000108000h,000000000h,080008000h,000008020h,080000000h,080100020h,080108020h,000108000h
dd 000000208h,008020200h,000000000h,008020008h,008000200h,000000000h,000020208h,008000200h
dd 000020008h,008000008h,008000008h,000020000h,008020208h,000020008h,008020000h,000000208h
dd 008000000h,000000008h,008020200h,000000200h,000020200h,008020000h,008020008h,000020208h
dd 008000208h,000020200h,000020000h,008000208h,000000008h,008020208h,000000200h,008000000h
dd 008020200h,008000000h,000020008h,000000208h,000020000h,008020200h,008000200h,000000000h
dd 000000200h,000020008h,008020208h,008000200h,008000008h,000000200h,000000000h,008020008h
dd 008000208h,000020000h,008000000h,008020208h,000000008h,000020208h,000020200h,008000008h
dd 008020000h,008000208h,000000208h,008020000h,000020208h,000000008h,008020008h,000020200h
dd 000802001h,000002081h,000002081h,000000080h,000802080h,000800081h,000800001h,000002001h
dd 000000000h,000802000h,000802000h,000802081h,000000081h,000000000h,000800080h,000800001h
dd 000000001h,000002000h,000800000h,000802001h,000000080h,000800000h,000002001h,000002080h
dd 000800081h,000000001h,000002080h,000800080h,000002000h,000802080h,000802081h,000000081h
dd 000800080h,000800001h,000802000h,000802081h,000000081h,000000000h,000000000h,000802000h
dd 000002080h,000800080h,000800081h,000000001h,000802001h,000002081h,000002081h,000000080h
dd 000802081h,000000081h,000000001h,000002000h,000800001h,000002001h,000802080h,000800081h
dd 000002001h,000002080h,000800000h,000802001h,000000080h,000800000h,000002000h,000802080h
dd 000000100h,002080100h,002080000h,042000100h,000080000h,000000100h,040000000h,002080000h
dd 040080100h,000080000h,002000100h,040080100h,042000100h,042080000h,000080100h,040000000h
dd 002000000h,040080000h,040080000h,000000000h,040000100h,042080100h,042080100h,002000100h
dd 042080000h,040000100h,000000000h,042000000h,002080100h,002000000h,042000000h,000080100h
dd 000080000h,042000100h,000000100h,002000000h,040000000h,002080000h,042000100h,040080100h
dd 002000100h,040000000h,042080000h,002080100h,040080100h,000000100h,002000000h,042080000h
dd 042080100h,000080100h,042000000h,042080100h,002080000h,000000000h,040080000h,042000000h
dd 000080100h,002000100h,040000100h,000080000h,000000000h,040080000h,002080100h,040000100h
dd 020000010h,020400000h,000004000h,020404010h,020400000h,000000010h,020404010h,000400000h
dd 020004000h,000404010h,000400000h,020000010h,000400010h,020004000h,020000000h,000004010h
dd 000000000h,000400010h,020004010h,000004000h,000404000h,020004010h,000000010h,020400010h
dd 020400010h,000000000h,000404010h,020404000h,000004010h,000404000h,020404000h,020000000h
dd 020004000h,000000010h,020400010h,000404000h,020404010h,000400000h,000004010h,020000010h
dd 000400000h,020004000h,020000000h,000004010h,020000010h,020404010h,000404000h,020400000h
dd 000404010h,020404000h,000000000h,020400010h,000000010h,000004000h,020400000h,000404010h
dd 000004000h,000400010h,020004010h,000000000h,020404000h,020000000h,000400010h,020004010h
dd 000200000h,004200002h,004000802h,000000000h,000000800h,004000802h,000200802h,004200800h
dd 004200802h,000200000h,000000000h,004000002h,000000002h,004000000h,004200002h,000000802h
dd 004000800h,000200802h,000200002h,004000800h,004000002h,004200000h,004200800h,000200002h
dd 004200000h,000000800h,000000802h,004200802h,000200800h,000000002h,004000000h,000200800h
dd 004000000h,000200800h,000200000h,004000802h,004000802h,004200002h,004200002h,000000002h
dd 000200002h,004000000h,004000800h,000200000h,004200800h,000000802h,000200802h,004200800h
dd 000000802h,004000002h,004200802h,004200000h,000200800h,000000000h,000000002h,004200802h
dd 000000000h,000200802h,004200000h,000000800h,004000002h,004000800h,000000800h,000200002h
dd 010001040h,000001000h,000040000h,010041040h,010000000h,010001040h,000000040h,010000000h
dd 000040040h,010040000h,010041040h,000041000h,010041000h,000041040h,000001000h,000000040h
dd 010040000h,010000040h,010001000h,000001040h,000041000h,000040040h,010040040h,010041000h
dd 000001040h,000000000h,000000000h,010040040h,010000040h,010001000h,000041040h,000040000h
dd 000041040h,000040000h,010041000h,000001000h,000000040h,010040040h,000001000h,000041040h
dd 010001000h,000000040h,010000040h,010040000h,010040040h,010000000h,000040000h,010001040h
dd 000000000h,010041040h,000040040h,010000040h,010040000h,010001000h,010001040h,000000000h
dd 010041040h,000041000h,000041000h,000001040h,000001040h,000040040h,010000000h,010041000h
.data?
align 16
KeyTab dd (16*8)/4 dup(?)
.code
align 16
DESSetKeyEnc proc pKey:PTR BYTE
lea eax,KeyTab
xi = 0
rept 8
%pxor mm&@CatStr(%xi),mm&@CatStr(%xi)
;xi = xi + 1
xi = (xi + 1) and 7
endm
;xi = 0
rept 8
%movq [eax+xi*8],mm&@CatStr(%xi)
xi = xi + 1
endm
rept 8
%movq [eax+xi*8],mm&@CatStr(%(xi-8))
xi = xi + 1
endm
invoke DESSetKey,pKey
ret
DESSetKeyEnc endp
align 16
DESSetKeyDec proc pKey:PTR BYTE
invoke DESSetKey,pKey
; reverse key schedule order
lea eax,KeyTab
comment #
xi = 0
for yi,<00,01,02,03,15,14,13,12>
%movq mm&@CatStr(%xi),[eax+yi*8]
xi = (xi + 1) and 7
endm
for yi,<15,14,13,12,00,01,02,03>
%movq [eax+yi*8],mm&@CatStr(%xi)
xi = (xi + 1) and 7
endm
for yi,<04,05,06,07,11,10,09,08>
%movq mm&@CatStr(%xi),[eax+yi*8]
xi = (xi + 1) and 7
endm
for yi,<11,10,09,08,04,05,06,07>
%movq [eax+yi*8],mm&@CatStr(%xi)
xi = (xi + 1) and 7
endm
#
movq mm0,[eax+0*8]
movq mm1,[eax+1*8]
movq mm2,[eax+2*8]
movq mm3,[eax+3*8]
movq mm4,[eax+15*8]
movq mm5,[eax+14*8]
movq mm6,[eax+13*8]
movq mm7,[eax+12*8]
movq [eax+15*8],mm0
movq [eax+14*8],mm1
movq [eax+13*8],mm2
movq [eax+12*8],mm3
movq [eax+0*8],mm4
movq [eax+1*8],mm5
movq [eax+2*8],mm6
movq [eax+3*8],mm7
movq mm0,[eax+4*8]
movq mm1,[eax+5*8]
movq mm2,[eax+6*8]
movq mm3,[eax+7*8]
movq mm4,[eax+11*8]
movq mm5,[eax+10*8]
movq mm6,[eax+9*8]
movq mm7,[eax+8*8]
movq [eax+11*8],mm0
movq [eax+10*8],mm1
movq [eax+9*8],mm2
movq [eax+8*8],mm3
movq [eax+4*8],mm4
movq [eax+5*8],mm5
movq [eax+6*8],mm6
movq [eax+7*8],mm7
ret
DESSetKeyDec endp
ROTL macro X,N
if N le 16
rol X,(N)
else
ror X,32-(N)
endif
endm
ROTR macro X,N
if N le 16
ror X,(N)
else
rol X,32-(N)
endif
endm
IPERM1 macro ww,ll,rr,cc,cc2
mov ww,ll
xor ww,rr
and ww,cc
xor ll,ww
xor rr,ww
ROTR rr,cc2
endm
FPERM1 macro ww,ll,rr,cc,cc2
mov ww,ll
xor ww,rr
and ww,cc
xor ll,ww
xor rr,ww
ROTR ll,cc2
endm
IPERM macro left,right
local work
work textequ <ecx>
rol right,4
IPERM1 work,left,right,11110000111100001111000011110000b,20
IPERM1 work,left,right,11111111111111110000000000000000b,18
IPERM1 work,left,right,00110011001100110011001100110011b,6
IPERM1 work,left,right,00000000111111110000000011111111b,32-9
FPERM1 work,left,right,10101010101010101010101010101010b,32-1
endm
FPERM macro left,right
local work;
work textequ <ecx>
ror right,1;
FPERM1 work,left,right,10101010101010101010101010101010b,9
FPERM1 work,left,right,00000000111111110000000011111111b,32-6
FPERM1 work,left,right,00110011001100110011001100110011b,32-18
FPERM1 work,left,right,11111111111111110000000000000000b,32-20
FPERM1 work,left,right,11110000111100001111000011110000b,4
endm
align 16
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
DESDecrypt proc pBlockIn:PTR BYTE,pBlockOut:PTR BYTE
DESDecrypt endp
DESEncrypt proc pBlockIn:PTR BYTE,pBlockOut:PTR BYTE
mov ecx,[esp][1*4];pBlockIn
push ebp
push esi
push edi
push ebx
l equ <eax>
r equ <edx>
mov l,[ecx][0]
mov r,[ecx][4]
bswap l
bswap r
IPERM l,r
xi = 0
repeat 8
mov ebx,r
ror ebx,4
xor ebx,[KeyTab+xi*4*4+0*4]
and ebx,00111111001111110011111100111111b
movzx edi,bl
movzx esi,bh
shr ebx,16
movzx ecx,bl
movzx ebx,bh
xor l,Spbox[6*64*4][edi*4]
xor l,Spbox[4*64*4][esi*4]
xor l,Spbox[2*64*4][ecx*4]
xor l,Spbox[0*64*4][ebx*4]
mov ebx,r
xor ebx,[KeyTab+xi*4*4+1*4]
and ebx,00111111001111110011111100111111b
movzx edi,bl
movzx esi,bh
shr ebx,16
movzx ecx,bl
movzx ebx,bh
xor l,Spbox[7*64*4][edi*4]
xor l,Spbox[5*64*4][esi*4]
xor l,Spbox[3*64*4][ecx*4]
xor l,Spbox[1*64*4][ebx*4]
mov ebx,l
ror ebx,4
xor ebx,[KeyTab+xi*4*4+2*4]
and ebx,00111111001111110011111100111111b
movzx edi,bl
movzx esi,bh
shr ebx,16
movzx ecx,bl
movzx ebx,bh
xor r,Spbox[6*64*4][edi*4]
xor r,Spbox[4*64*4][esi*4]
xor r,Spbox[2*64*4][ecx*4]
xor r,Spbox[0*64*4][ebx*4]
mov ebx,l
xor ebx,[KeyTab+xi*4*4+3*4]
and ebx,00111111001111110011111100111111b
movzx edi,bl
movzx esi,bh
shr ebx,16
movzx ecx,bl
movzx ebx,bh
xor r,Spbox[7*64*4][edi*4]
xor r,Spbox[5*64*4][esi*4]
xor r,Spbox[3*64*4][ecx*4]
xor r,Spbox[1*64*4][ebx*4]
xi = xi + 1
endm
FPERM l,r
mov ecx,[esp][2*4][4*4];pBlockOut
bswap l
bswap r
mov [ecx][0],r
mov [ecx][4],l
pop ebx
pop edi
pop esi
pop ebp
ret 1*4
DESEncrypt endp
align 16
DESSetKey proc pKey:PTR BYTE
mov eax,[esp][1*4]
mov ecx,[eax][0]
mov edx,[eax][4]
bswap ecx
bswap edx
push ebp
push esi
push edi
push ebx
lea edi,KeyTab
test edx,000000002h
jz @F
mov eax,000000004h
mov ebx,000000100h
mov esi,000000001h
mov ebp,000000800h
or [edi][0*8][0],eax
or [edi][1*8][0],ebx
or [edi][2*8][0],esi
or [edi][3*8][4],ebp
mov eax,000000010h
mov ebx,000000200h
mov esi,000000400h
mov ebp,000000010h
or [edi][4*8][0],eax
or [edi][5*8][0],ebx
or [edi][6*8][4],esi
or [edi][8*8][4],ebp
mov eax,000001000h
mov ebx,000000004h
mov esi,000000002h
mov ebp,000000001h
or [edi][9*8][4],eax
or [edi][11*8][4],ebx
or [edi][12*8][0],esi
or [edi][13*8][4],ebp
mov eax,000002000h
mov ebx,000000002h
or [edi][14*8][4],eax
or [edi][15*8][4],ebx
@@:
test edx,000000004h
jz @F
mov eax,000000004h
mov ebx,000000200h
mov esi,000000800h
mov ebp,000000002h
or [edi][0*8][4],eax
or [edi][2*8][4],ebx
or [edi][3*8][0],esi
or [edi][4*8][4],ebp
mov eax,000000100h
mov ebx,000000001h
mov esi,000000800h
mov ebp,000000008h
or [edi][5*8][0],eax
or [edi][6*8][0],ebx
or [edi][7*8][4],esi
or [edi][8*8][4],ebp
mov eax,000000100h
mov ebx,000000020h
mov esi,000000020h
mov ebp,000000010h
or [edi][9*8][4],eax
or [edi][10*8][4],ebx
or [edi][11*8][0],esi
or [edi][12*8][4],ebp
mov eax,000001000h
mov ebx,000000400h
or [edi][13*8][4],eax
or [edi][15*8][0],ebx
@@:
test edx,000000008h
jz @F
mov eax,000000020h
mov ebx,000002000h
mov esi,000000008h
mov ebp,000000400h
or [edi][0*8][0],eax
or [edi][2*8][0],ebx
or [edi][3*8][0],esi
or [edi][4*8][0],ebp
mov eax,000000200h
mov ebx,000000800h
mov esi,000002000h
mov ebp,000000004h
or [edi][6*8][4],eax
or [edi][7*8][0],ebx
or [edi][8*8][4],esi
or [edi][9*8][0],ebp
mov eax,000001000h
mov ebx,000000008h
mov esi,000000100h
mov ebp,000000020h
or [edi][11*8][0],eax
or [edi][12*8][4],ebx
or [edi][13*8][4],esi
or [edi][14*8][4],ebp
mov eax,000000400h
or [edi][15*8][4],eax
@@:
test edx,000000010h
jz @F
mov eax,004000000h
mov ebx,000200000h
mov esi,002000000h
mov ebp,000100000h
or [edi][0*8][0],eax
or [edi][1*8][0],ebx
or [edi][2*8][4],esi
or [edi][3*8][0],ebp
mov eax,010000000h
mov ebx,008000000h
mov esi,000020000h
mov ebp,008000000h
or [edi][4*8][0],eax
or [edi][5*8][4],ebx
or [edi][6*8][4],esi
or [edi][7*8][0],ebp
mov eax,001000000h
mov ebx,000010000h
mov esi,004000000h
mov ebp,000040000h
or [edi][8*8][4],eax
or [edi][9*8][0],ebx
or [edi][10*8][4],esi
or [edi][11*8][0],ebp
mov eax,000010000h
mov ebx,010000000h
mov esi,000020000h
or [edi][12*8][4],eax
or [edi][13*8][4],ebx
or [edi][14*8][0],esi
@@:
test edx,000000020h
jz @F
mov eax,000200000h
mov ebx,008000000h
mov esi,000020000h
mov ebp,008000000h
or [edi][0*8][4],eax
or [edi][1*8][4],ebx
or [edi][2*8][4],esi
or [edi][3*8][0],ebp
mov eax,000100000h
mov ebx,001000000h
mov esi,020000000h
mov ebp,000010000h
or [edi][5*8][4],eax
or [edi][6*8][0],ebx
or [edi][7*8][4],esi
or [edi][8*8][4],ebp
mov eax,010000000h
mov ebx,000020000h
mov esi,004000000h
mov ebp,000040000h
or [edi][9*8][4],eax
or [edi][10*8][0],ebx
or [edi][11*8][0],esi
or [edi][13*8][4],ebp
mov eax,010000000h
or [edi][15*8][0],eax
@@:
test edx,000000040h
jz @F
mov eax,000010000h
mov ebx,000100000h
mov esi,001000000h
mov ebp,020000000h
or [edi][0*8][0],eax
or [edi][1*8][4],ebx
or [edi][2*8][0],esi
or [edi][3*8][4],ebp
mov eax,002000000h
mov ebx,000080000h
mov esi,000200000h
mov ebp,000040000h
or [edi][4*8][0],eax
or [edi][5*8][4],ebx
or [edi][7*8][0],esi
or [edi][9*8][4],ebp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -