📄 bf.asm
字号:
.if lParam!=0
mov edx,wParam
shr edx,16
.if dx==BN_CLICKED
.if ax==IDC_OK
invoke GetDlgItemText, hDlg, IDC_EDIT0, addr Psw, 56
invoke SendMessage, hDlg, WM_CLOSE, NULL, NULL
.endif
.endif
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc1 endp
Blowfish proc lpOutBuffer:dword, lpInBuffer:dword, lpPsw:dword, uModel:dword
call BF_Init
invoke lstrlen, lpInBuffer
test eax,eax
jz @3
mov ecx,8
div cl
mov cl,al
cmp ah,0
jz @1
inc ecx
@1:
mov esi,lpInBuffer
mov ebx,0
@2:
mov eax,dword ptr [esi+ebx*8]
mov edx,dword ptr [esi+ebx*8+4]
bswap eax
bswap edx
xchg eax,edx
push ecx
push ebx
push esi
.if uModel==1
push edx
push eax
call BF_Encrypt
.elseif uModel==0
push edx
push eax
call BF_Decrypt
.endif
pop esi
pop ebx
pop ecx
bswap eax
bswap edx
xchg eax,edx
mov edi,lpOutBuffer
mov dword ptr [edi+ebx*8],eax
mov dword ptr [edi+ebx*8+4],edx
inc ebx
loop @2
jmp @4
@3:
invoke MessageBox, NULL, addr szMsg1, NULL, MB_OK
@4:
ret
Blowfish endp
BF_Init proc
local dwPsw:dword
local lpPbox:dword
local lpK_Pbox:dword
local dwBF_Low:dword
local dwBF_High:dword
;******************************************************************
;* Initialize K_Pbox *
;******************************************************************
mov ebx,1
mov esi,12h
mov lpPbox,offset Pbox
mov lpK_Pbox,offset K_Pbox
@1:
xor eax,eax
mov dwPsw,eax
mov edi,4
@2:
mov eax,dwPsw
shl eax,8
mov edx,offset Psw
movzx edx,byte ptr ds:[edx+ebx-1]
or eax,edx
mov dwPsw,eax
inc ebx
mov eax,offset Psw
invoke lstrlen, eax
cmp ebx,eax
jle @3
mov ebx,1
@3:
dec edi
jnz @2
mov eax,lpPbox
mov eax,dword ptr ds:[eax]
xor eax,dwPsw
mov edx,lpK_Pbox
mov dword ptr ds:[edx],eax
add lpK_Pbox,4
add lpPbox,4
dec esi
jnz @1
;******************************************************************
;* Initialize K_Sbox *
;******************************************************************
xor esi,esi
mov edx,offset Sbox1
@4:
xor ebx,ebx
mov eax,edx
@5:
mov ecx,esi
shl ecx,8
add ecx,ebx
mov edi,dword ptr ds:[eax]
mov dword ptr ds:[ecx*4+offset K_Sbox],edi
inc ebx
add eax,4
cmp ebx,100h
jnz @5
inc esi
add edx,400h
cmp esi,4
jnz @4
;******************************************************************
;* Initialize Subkey *
;******************************************************************
mov dwBF_Low,0
mov dwBF_High,0
mov esi,209h
lea ebx,K_Pbox
@6:
push esi
push ebx
push dwBF_High
push dwBF_Low
call BF_Encrypt
pop ebx
pop esi
mov dwBF_Low,eax
mov dwBF_High,edx
mov eax,dwBF_High
xor edx,edx
mov dword ptr ds:[ebx],eax
mov eax,dwBF_Low
mov edx,dwBF_High
mov dword ptr ds:[ebx+4],eax
add ebx,8
dec esi
jnz @6
xor eax,eax
ret
BF_Init endp
;******************************************************************
;* BF_Encrypt *
;******************************************************************
BF_Encrypt proc BF_Low:dword, BF_High:dword
local temp:dword
mov eax,BF_High
mov esi,eax
mov eax,BF_Low
mov edx,BF_High
mov temp,eax
mov bl,1
mov edi,offset K_Pbox
@1:
push ebx
xor esi,dword ptr ds:[edi]
mov eax,esi
call BF_Func
pop ebx
xor temp,eax
cmp bl,10h
jnb @2
mov eax,temp
mov temp,esi
mov esi,eax
@2:
inc ebx
add edi,4
cmp bl,11h
jnz @1
mov eax,dword ptr ds:[K_Pbox+16*4]
xor temp,eax
xor esi,dword ptr ds:[K_Pbox+17*4]
mov eax,temp
mov edx,esi
ret
BF_Encrypt endp
;******************************************************************
;* BF_Decrypt *
;******************************************************************
BF_Decrypt proc BF_Low:dword, BF_High:dword
local temp:dword
mov eax,BF_High
mov esi,eax
mov eax,BF_Low
mov edx,BF_High
mov temp,eax
mov eax,dword ptr ds:[K_Pbox+16*4]
xor temp,eax
xor esi,dword ptr ds:[K_Pbox+17*4]
mov bl,10h
mov edi,offset K_Pbox+15*4
@1:
cmp bl,10h
jnb @2
mov eax,temp
mov temp,esi
mov esi,eax
@2:
push ebx
mov eax,esi
call BF_Func
pop ebx
xor temp,eax
xor esi,dword ptr ds:[edi]
dec ebx
sub edi,4
test bl,bl
jnz @1
mov edx,esi
mov eax,temp
ret
BF_Decrypt endp
;******************************************************************
;* BF_Function *
;******************************************************************
BF_Func proc
local temp:dword
mov ebx,eax
and ebx,0FF000000h
shr ebx,18h
mov edx,eax
and edx,0FF0000h
shr edx,10h
mov byte ptr temp,dl
mov edx,eax
and edx,0FF00h
shr edx,8
mov byte ptr temp+1,dl
and al,0FFh
mov byte ptr temp+2,al
xor eax,eax
mov al,bl
mov eax,dword ptr ds:[eax*4+offset K_Sbox] ;K_Sbox1
xor edx,edx
mov dl,byte ptr temp
add eax,dword ptr ds:[edx*4+offset K_Sbox+400h] ;K_Sbox2
xor edx,edx
push edx
push eax
xor eax,eax
mov al,byte ptr temp+1
mov eax,dword ptr ds:[eax*4+offset K_Sbox+800h] ;K_Sbox3
xor edx,edx
xor eax,dword ptr ss:[esp]
xor edx,dword ptr ss:[esp+4]
add esp,8
push edx
push eax
xor eax,eax
mov al,byte ptr temp+2
mov eax,dword ptr ds:[eax*4+offset K_Sbox+0c00h] ;K_Sbox4
xor edx,edx
add eax,dword ptr ss:[esp]
adc edx,dword ptr ss:[esp+4]
add esp,8
ret
BF_Func endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -