返回首页

加密算法之BLOWFISH算法(3)

时间:2005-12-20 来源: 作者: 点击:
.code ;s盒变换函数 BlowFish_Fun proc uses ebx edi esi edx ecx,BfNum:DWORD MOV ECX,BfNum MOV AL,CL AND EAX,0FFh SHR ECX,08 MOV EDX,EAX MOV AL,CL MOV EDI,offset key AND EAX,0FFh SHR ECX,08 MOV ESI,EAX MOV EAX,ECX SHR EAX,08 AND EAX,0FFh AND ECX,0FFh A
          .code
        ;s盒变换函数
        BlowFish_Fun proc uses ebx edi esi edx ecx,BfNum:DWORD
            MOV      ECX,BfNum
    MOV      AL,CL
    AND      EAX,0FFh
    SHR      ECX,08
    MOV      EDX,EAX               
    MOV      AL,CL
    MOV      EDI,offset key
    AND      EAX,0FFh
    SHR      ECX,08
    MOV      ESI,EAX               
    MOV      EAX,ECX
    SHR      EAX,08
    AND      EAX,0FFh
    AND      ECX,0FFh
    AND      ESI,0FFFFh
    AND      EDX,0FFFFh
    MOV      EAX,[EDI+EAX*4+48h]
    MOV      EBX,[EDI+ECX*4+0448h]
    MOV      ECX,[EDI+ESI*4+0848h]
    ADD      EAX,EBX
    XOR      EAX,ECX
    MOV      ECX,[EDI+EDX*4+0C48h]
    ADD      EAX,ECX
    RET   
        BlowFish_Fun endp

        ;BlowFish加密算法函数
        BlowFish_En  proc uses ebx edi esi edx ecx,highbf:DWORD,lowbf:DWORD
    LOCAL    num :DWORD
    MOV      EAX,highbf
    MOV      ECX,lowbf
    MOV      EAX,[EAX]
    MOV      ESI,[ECX]
    MOV      EDI,offset key
    MOV      num,10h
    MOV      EBX,EDI
loc_40108E:
    XOR      EAX,[EBX]
    MOV      EDX,EAX
    invoke  BlowFish_Fun,EAX
    MOV      ECX,num
    XOR      EAX,ESI
    ADD      EBX,4
    DEC      ECX
    MOV      ESI,EDX
    MOV      num,ECX
    JNZ      loc_40108E

    MOV      ECX,[EDI+40h]
    MOV      EDX,[EDI+44h]
    XOR      ECX,EAX
    XOR      EDX,ESI

    MOV      [BFHIGH],EDX
    MOV      [BFLOW],ECX
    RET
        BlowFish_En  endp

        ;BlowFish初始化函数
        BlowFish_Init proc uses ebx edi esi edx ecx,PWD:DWORD,len_PWD:DWORD
    LOCAL    pbox_num18:DWORD
    LOCAL    pbox_num4 :DWORD
    LOCAL    snum      :DWORD
;初始化s盒
    MOV      ESI,offset key
    MOV      EAX,offset sbox1
    LEA      ECX,[ESI+48h]
loc_401141:
    MOV      EDX,0100h
loc_401146:    
    MOV      EDI,[EAX]
    ADD      EAX,4
    MOV      [ECX],EDI
    ADD      ECX,4
    DEC      EDX
    JNZ      loc_401146
    CMP      EAX,offset sbox1+1000h
    JL      loc_401141

;初始化p盒
;第一步:原p盒与PWD逐项异或
    
    MOV      EDX,PWD
    MOV      EDI,offset pbox
    XOR      EAX,EAX
    SUB      EDI,ESI
    MOV      pbox_num18,12h
loc_401173:    
    XOR      ECX,ECX
    MOV      pbox_num4,04
loc_40117D:    
    XOR      EBX,EBX
    MOV      BL,[EAX+EDX]
    SHL      ECX,08
    OR      ECX,EBX
    INC      EAX
    CMP      EAX,len_PWD
    JL      loc_40118E
    XOR      EAX,EAX
loc_40118E:
    MOV      EBX,pbox_num4
    DEC      EBX
    MOV      pbox_num4,EBX
    JNZ      loc_40117D
    MOV      EBX,[EDI+ESI]
    ADD      ESI,4
    XOR      EBX,ECX
    MOV      ECX,pbox_num18
    MOV      [ESI-04],EBX
    DEC      ECX
    MOV      pbox_num18,ECX
    JNZ      loc_401173

;用连续的blowfish算法填充p盒
    MOV      EBX,offset key
    XOR      EAX,EAX
    MOV      BFLOW,EAX
    MOV      BFHIGH,EAX
    MOV      ESI,EBX
    MOV      EDI,09
loc_4011C4:
    LEA      EAX,BFLOW
    LEA      ECX,BFHIGH
    invoke  BlowFish_En,ECX,EAX
    MOV      EAX,BFHIGH
    MOV      ECX,BFLOW
    MOV      [ESI],EAX
    MOV      [ESI+04],ECX
    ADD      ESI,8
    DEC      EDI
    JNZ      loc_4011C4

;用连续的blowfish算法填充s盒
    LEA      ESI,[EBX+4Ch]
    MOV      snum,04        ;4个s盒。
loc_4011F2:    
    MOV      EDI,80H        ;每个盒填充80h=128次(每次填充两个数)。
loc_4011F7:
    LEA      ECX,BFLOW
    LEA      EDX,BFHIGH
    invoke  BlowFish_En,EDX,ECX
    MOV      ECX,BFHIGH
    MOV      EDX,BFLOW
    MOV      [ESI-04],ECX
    MOV      [ESI],EDX
    ADD      ESI,8
    DEC      EDI
    JNZ      loc_4011F7
    DEC      snum
    JNZ      loc_4011F2
    RET   
      BlowFish_Init endp

      ;消息处理函数
        _ProcDlgMain proc uses ebx edi esi edx ecx,hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
        mov    eax,wMsg
        .if    eax==WM_CLOSE
                invoke  EndDialog,hWnd,NULL
        .elseif eax==WM_COMMAND
                mov  eax,wParam
                and  eax,0ffffh
                .if    eax==IDGEN
------分隔线----------------------------
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容