VB中实现MD5加密[4]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 bucher 的 blog

public sub md5init()
    bytecounter = 0
    state(1) = unsignedtolong(1732584193#)
    state(2) = unsignedtolong(4023233417#)
    state(3) = unsignedtolong(2562383102#)
    state(4) = unsignedtolong(271733878#)
end sub

'
' md5 final
'
public sub md5final()
    dim dblbits as double
   
    dim padding(72) as byte
    dim lngbytesbuffered as long
   
    padding(0) = &h80
   
    dblbits = bytecounter * 8
   
    ' pad out
    lngbytesbuffered = bytecounter mod 64
    if lngbytesbuffered <= 56 then
        md5update 56 - lngbytesbuffered, padding
    else
        md5update 120 - bytecounter, padding
    end if
   
   
    padding(0) = unsignedtolong(dblbits) and &hff&
    padding(1) = unsignedtolong(dblbits) \ 256 and &hff&
    padding(2) = unsignedtolong(dblbits) \ 65536 and &hff&
    padding(3) = unsignedtolong(dblbits) \ 16777216 and &hff&
    padding(4) = 0
    padding(5) = 0
    padding(6) = 0
    padding(7) = 0
   
    md5update 8, padding
end sub

'
' break up input stream into 64 byte chunks
'
public sub md5update(inputlen as long, inputbuffer() as byte)
    dim ii as integer
    dim i as integer
    dim j as integer
    dim k as integer
    dim lngbufferedbytes as long
    dim lngbufferremaining as long
    dim lngrem as long
   
    lngbufferedbytes = bytecounter mod 64
    lngbufferremaining = 64 - lngbufferedbytes
    bytecounter = bytecounter + inputlen
    ' use up old buffer results first
    if inputlen >= lngbufferremaining then
        for ii = 0 to lngbufferremaining - 1
            bytebuffer(lngbufferedbytes + ii) = inputbuffer(ii)
        next ii
        md5transform bytebuffer
       
        lngrem = (inputlen) mod 64
        ' the transfer is a multiple of 64 lets do some transformations
        for i = lngbufferremaining to inputlen - ii - lngrem step 64
            for j = 0 to 63
                bytebuffer(j) = inputbuffer(i + j)
            next j
            md5transform bytebuffer
        next i
        lngbufferedbytes = 0
    else
      i = 0
    end if
   
    ' buffer any remaining input
    for k = 0 to inputlen - i - 1
        bytebuffer(lngbufferedbytes + k) = inputbuffer(i + k)
    next k
   
end sub

'
' md5 transform
'
private sub md5transform(buffer() as byte)
    dim x(16) as long
    dim a as long
    dim b as long
    dim c as long
    dim d as long
   
    a = state(1)
    b = state(2)
    c = state(3)
    d = state(4)
   
    decode 64, x, buffer

    ' round 1
    ff a, b, c, d, x(0), s11, -680876936
    ff d, a, b, c, x(1), s12, -389564586
    ff c, d, a, b, x(2), s13, 606105819
    ff b, c, d, a, x(3), s14, -1044525330
    ff a, b, c, d, x(4), s11, -176418897
    ff d, a, b, c, x(5), s12, 1200080426
    ff c, d, a, b, x(6), s13, -1473231341
    ff b, c, d, a, x(7), s14, -45705983

本文关键:MD5,VB6
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top