📄 twofish.asm
字号:
pop edi
pop ebp
ret 2*4
h_fun endp
copy_key macro i
mov eax,[esi+i*8+0]
mov edx,[esi+i*8+4]
mov me_key[i*4],eax
mov mo_key[i*4],edx
endm
; 3390 clk
align 16
TwofishInit proc in_key,key_len
push ebp
push edi
push esi
push ebx
twofish_set_key_locals equ 4*4+4*4
sub esp,twofish_set_key_locals
me_key equ [esp+0*4]
mo_key equ [esp+4*4]
mov ebp,[esp+2*4][4*4+twofish_set_key_locals];key_len
mov esi,[esp+1*4][4*4+twofish_set_key_locals];in_key
shr ebp,3
mov k_len,ebp
copy_key 0
copy_key 1
sub ebp,2
jz copy_key_done
copy_key 2
dec ebp
jz copy_key_done
copy_key 3
copy_key_done:
mov ebp,offset l_key
mov edi,-40*4
xor ebx,ebx
.repeat
invoke h_fun,ebx,addr me_key
mov esi,eax
add ebx,001010101h
invoke h_fun,ebx,addr mo_key
rol eax,8
add ebx,001010101h
lea ecx,[esi+eax]
lea edx,[esi+eax*2]
rol edx,9
mov [ebp+40*4+edi+0],ecx; = a + b;
mov [ebp+40*4+edi+4],edx; = rotl(a + 2 * b, 9);
add edi,2*4
.until zero?;edi>=40*4
add esp,twofish_set_key_locals
mov eax,ebp
mov edx,sizeof l_key
pop ebx
pop esi
pop edi
pop ebp
ret 2*4
TwofishInit endp
g_fun macro blk_x,blk_x_lo,blk_x_hi, blk_y,blk_y_lo,blk_y_hi, nx,ny
;t0,t1 is esi,edi
;blk is <eax,ebx,ecx,edx>
movzx esi,blk_x_lo
movzx ebp,blk_x_hi
movzx edi,blk_y_lo
mov esi,mk_tab[0*256*4][esi*4]
xor esi,mk_tab[1*256*4][ebp*4]
ror blk_x,16
movzx ebp,blk_x_lo
mov edi,mk_tab[1*256*4][edi*4]
xor esi,mk_tab[2*256*4][ebp*4]
movzx ebp,blk_x_hi
xor esi,mk_tab[3*256*4][ebp*4]
movzx ebp,blk_y_hi
ror blk_y,16
xor edi,mk_tab[2*256*4][ebp*4]
movzx ebp,blk_y_lo
xor edi,mk_tab[3*256*4][ebp*4]
movzx ebp,blk_y_hi
xor edi,mk_tab[0*256*4][ebp*4]
ror blk_y,16
ror blk_x,16
add esi,edi
add edi,esi
add esi,l_key[(4*xi+nx)*4]
add edi,l_key[(4*xi+ny)*4]
endm
; 312 clk
align 16
TwofishEncrypt proc pin_blk,pout_blk
push ebp
push edi
push esi
push ebx
mov esi,[esp+1*4][4*4];pin_blk
mov eax,l_key[0*4]
mov ebx,l_key[1*4]
mov ecx,l_key[2*4]
mov edx,l_key[3*4]
xor eax,[esi+0*4]
xor ebx,[esi+1*4]
xor ecx,[esi+2*4]
xor edx,[esi+3*4]
xi = 0
rept 8
g_fun eax,al,ah, ebx,bl,bh, 8,9
xor ecx,esi
ror ecx,1
rol edx,1
xor edx,edi
g_fun ecx,cl,ch, edx,dl,dh, 10,11
xor eax,esi
ror eax,1
rol ebx,1
xor ebx,edi
xi = xi + 1
endm
mov edi,[esp+2*4][4*4];pout_blk
xor ecx,l_key[4*4]
xor edx,l_key[5*4]
xor eax,l_key[6*4]
xor ebx,l_key[7*4]
mov [edi+0*4],ecx
mov [edi+1*4],edx
mov [edi+2*4],eax
mov [edi+3*4],ebx
pop ebx
pop esi
pop edi
pop ebp
ret 2*4
TwofishEncrypt endp
; 306 clk
align 16
TwofishDecrypt proc pin_blk,pout_blk
push ebp
push edi
push esi
push ebx
mov esi,[esp+1*4][4*4];pin_blk
mov eax,l_key[4*4]
mov ebx,l_key[5*4]
mov ecx,l_key[6*4]
mov edx,l_key[7*4]
xor eax,[esi+0*4]
xor ebx,[esi+1*4]
xor ecx,[esi+2*4]
xor edx,[esi+3*4]
xi = 7
rept 8
g_fun eax,al,ah, ebx,bl,bh, 10,11
xor edx,edi
rol ecx,1
ror edx,1
xor ecx,esi
g_fun ecx,cl,ch, edx,dl,dh, 8,9
xor ebx,edi
rol eax,1
ror ebx,1
xor eax,esi
xi = xi - 1
endm
mov edi,[esp+2*4][4*4];pout_blk
xor ecx,l_key[0*4]
xor edx,l_key[1*4]
xor eax,l_key[2*4]
xor ebx,l_key[3*4]
mov [edi+0*4],ecx
mov [edi+1*4],edx
mov [edi+2*4],eax
mov [edi+3*4],ebx
pop ebx
pop esi
pop edi
pop ebp
ret 2*4
TwofishDecrypt endp
OPTION PROLOGUE:PROLOGUEDEF
OPTION EPILOGUE:EPILOGUEDEF
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -