ASP版MD5加密函数及用法

MD5.asp 文件内容

<%
Private   Const  BITS_TO_A_BYTE  =   8
Private   Const  BYTES_TO_A_WORD  =   4
Private   Const  BITS_TO_A_WORD  =   32

Private  m_lOnBits( 30 )
Private  m_l2Power( 30 )
Dim  Md5OLD
Private   Function  LShift(lValue, iShiftBits)
    
If  iShiftBits  =   0   Then
        LShift 
=  lValue
        
Exit   Function
    
ElseIf  iShiftBits  =   31   Then
        
If  lValue  And   1   Then
            LShift 
=   & H80000000
        
Else
            LShift 
=   0
        
End   If
        
Exit   Function
    
ElseIf  iShiftBits  <   0   or  iShiftBits  >   31   Then
        Err.Raise 
6
    
End   If

    
If  (lValue  And  m_l2Power( 31   -  iShiftBits))  Then
        LShift 
=  ((lValue  And  m_lOnBits( 31   -  (iShiftBits  +   1 )))  *  m_l2Power(iShiftBits))  or   & H80000000
    
Else
        LShift 
=  ((lValue  And  m_lOnBits( 31   -  iShiftBits))  *  m_l2Power(iShiftBits))
    
End   If
End Function

Private   Function  str2bin(varstr) 
    
Dim  varasc
    
Dim  i
    
Dim  varchar
    
Dim  varlow
    
Dim  varhigh
    
    str2bin
= ""  
    
For  i = 1   To   Len (varstr) 
        varchar
= mid (varstr,i, 1
        varasc 
=   Asc (varchar) 
        
        
If  varasc < 0   Then  
        varasc 
=  varasc  +   65535  
        
End   If  
        
        
If  varasc > 255   Then  
        varlow 
=   Left ( Hex ( Asc (varchar)), 2
        varhigh 
=   right ( Hex ( Asc (varchar)), 2
        str2bin 
=  str2bin  &  chrB( " &H "   &  varlow)  &  chrB( " &H "   &  varhigh) 
        
Else  
        str2bin 
=  str2bin  &  chrB(AscB(varchar)) 
        
End   If  
    
Next  
End Function  

Private   Function  RShift(lValue, iShiftBits)
    
If  iShiftBits  =   0   Then
        RShift 
=  lValue
        
Exit   Function
    
ElseIf  iShiftBits  =   31   Then
        
If  lValue  And   & H80000000  Then
            RShift 
=   1
        
Else
            RShift 
=   0
        
End   If
        
Exit   Function
    
ElseIf  iShiftBits  <   0   or  iShiftBits  >   31   Then
        Err.Raise 
6
    
End   If

    RShift 
=  (lValue  And   & H7FFFFFFE)   m_l2Power(iShiftBits)

    
If  (lValue  And   & H80000000)  Then
        RShift 
=  (RShift  or  ( & H40000000   m_l2Power(iShiftBits  -   1 )))
    
End   If
End Function

Private   Function  RotateLeft(lValue, iShiftBits)
    RotateLeft 
=  LShift(lValue, iShiftBits)  or  RShift(lValue, ( 32   -  iShiftBits))
End Function

Private   Function  AddUnsigned(lX, lY)
    
Dim  lX4
    
Dim  lY4
    
Dim  lX8
    
Dim  lY8
    
Dim  lResult

    lX8 
=  lX  And   & H80000000
    lY8 
=  lY  And   & H80000000
    lX4 
=  lX  And   & H40000000
    lY4 
=  lY  And   & H40000000
    
    lResult 
=  (lX  And   & H3FFFFFFF)  +  (lY  And   & H3FFFFFFF)

    
If  lX4  And  lY4  Then
        lResult 
=  lResult  Xor   & H80000000  Xor  lX8  Xor  lY8
    
ElseIf  lX4  or  lY4  Then
        
If  lResult  And   & H40000000  Then
            lResult 
=  lResult  Xor   & HC0000000  Xor  lX8  Xor  lY8
        
Else
            lResult 
=  lResult  Xor   & H40000000  Xor  lX8  Xor  lY8
        
End   If
    
Else
        lResult 
=  lResult  Xor  lX8  Xor  lY8
    
End   If

    AddUnsigned 
=  lResult
End Function

Private   Function  md5_F(x, y, z)
    md5_F 
=  (x  And  y)  or  (( Not  x)  And  z)
End Function

Private   Function  md5_G(x, y, z)
    md5_G 
=  (x  And  z)  or  (y  And  ( Not  z))
End Function

Private   Function  md5_H(x, y, z)
    md5_H 
=  (x  Xor  y  Xor  z)
End Function

Private   Function  md5_I(x, y, z)
    md5_I 
=  (y  Xor  (x  or  ( Not  z)))
End Function

Private   Sub  md5_FF(a, b, c, d, x, s, ac)
    a 
=  AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
    a 
=  RotateLeft(a, s)
    a 
=  AddUnsigned(a, b)
End Sub

Private   Sub  md5_GG(a, b, c, d, x, s, ac)
    a 
=  AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
    a 
=  RotateLeft(a, s)
    a 
=  AddUnsigned(a, b)
End Sub

Private   Sub  md5_HH(a, b, c, d, x, s, ac)
    a 
=  AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
    a 
=  RotateLeft(a, s)
    a 
=  AddUnsigned(a, b)
End Sub

Private   Sub  md5_II(a, b, c, d, x, s, ac)
    a 
=  AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
    a 
=  RotateLeft(a, s)
    a 
=  AddUnsigned(a, b)
End Sub

Private   Function  ConvertToWordArray(sMessage)
    
Dim  lMessageLength
    
Dim  lNumberOfWords
    
Dim  lWordArray()
    
Dim  lBytePosition
    
Dim  lByteCount
    
Dim  lWordCount
    
Const  MODULUS_BITS  =   512
    
Const  CONGRUENT_BITS  =   448
    
If  Md5OLD  =   1   Then
        lMessageLength 
=   Len (sMessage)
    
Else
        lMessageLength 
=  LenB(sMessage)
    
End   If
    lNumberOfWords 
=  (((lMessageLength  +  ((MODULUS_BITS  -  CONGRUENT_BITS)   BITS_TO_A_BYTE))   (MODULUS_BITS   BITS_TO_A_BYTE))  +   1 *  (MODULUS_BITS   BITS_TO_A_WORD)
    
ReDim  lWordArray(lNumberOfWords  -   1 )
    
    lBytePosition 
=   0
    lByteCount 
=   0
    
Do  Until lByteCount  >=  lMessageLength
        lWordCount 
=  lByteCount   BYTES_TO_A_WORD
        lBytePosition 
=  (lByteCount  Mod  BYTES_TO_A_WORD)  *  BITS_TO_A_BYTE
        
If  Md5OLD  =   1   Then
            lWordArray(lWordCount) 
=  lWordArray(lWordCount)  or  LShift( Asc ( Mid (sMessage, lByteCount  +   1 1 )), lBytePosition)
        
Else
            lWordArray(lWordCount) 
=  lWordArray(lWordCount)  or  LShift(AscB(MidB(sMessage, lByteCount  +   1 1 )), lBytePosition)
        
End   If
        lByteCount 
=  lByteCount  +   1
    
Loop
    lWordCount 
=  lByteCount   BYTES_TO_A_WORD
    lBytePosition 
=  (lByteCount  Mod  BYTES_TO_A_WORD)  *  BITS_TO_A_BYTE
    lWordArray(lWordCount) 
=  lWordArray(lWordCount)  or  LShift( & H80, lBytePosition)
    lWordArray(lNumberOfWords 
-   2 =  LShift(lMessageLength,  3 )
    lWordArray(lNumberOfWords 
-   1 =  RShift(lMessageLength,  29 )
    ConvertToWordArray 
=  lWordArray
End Function

Private   Function  WordToHex(lValue)
    
Dim  lByte
    
Dim  lCount
    
For  lCount  =   0   To   3
        lByte 
=  RShift(lValue, lCount  *  BITS_TO_A_BYTE)  And  m_lOnBits(BITS_TO_A_BYTE  -   1 )
        WordToHex 
=  WordToHex  &   Right ( " 0 "   &   Hex (lByte),  2 )
    
Next
End Function

Public   Function  MD5(sMessage,stype)
    m_lOnBits(
0 =   CLng ( 1 )
    m_lOnBits(
1 =   CLng ( 3 )
    m_lOnBits(
2 =   CLng ( 7 )
    m_lOnBits(
3 =   CLng ( 15 )
    m_lOnBits(
4 =   CLng ( 31 )
    m_lOnBits(
5 =   CLng ( 63 )
    m_lOnBits(
6 =   CLng ( 127 )
    m_lOnBits(
7 =   CLng ( 255 )
    m_lOnBits(
8 =   CLng ( 511 )
    m_lOnBits(
9 =   CLng ( 1023 )
    m_lOnBits(
10 =   CLng ( 2047 )
    m_lOnBits(
11 =   CLng ( 4095 )
    m_lOnBits(
12 =   CLng ( 8191 )
    m_lOnBits(
13 =   CLng ( 16383 )
    m_lOnBits(
14 =   CLng ( 32767 )
    m_lOnBits(
15 =   CLng ( 65535 )
    m_lOnBits(
16 =   CLng ( 131071 )
    m_lOnBits(
17 =   CLng ( 262143 )
    m_lOnBits(
18 =   CLng ( 524287 )
    m_lOnBits(
19 =   CLng ( 1048575 )
    m_lOnBits(
20 =   CLng ( 2097151 )
    m_lOnBits(
21 =   CLng ( 4194303 )
    m_lOnBits(
22 =   CLng ( 8388607 )
    m_lOnBits(
23 =   CLng ( 16777215 )
    m_lOnBits(
24 =   CLng ( 33554431 )
    m_lOnBits(
25 =   CLng ( 67108863 )
    m_lOnBits(
26 =   CLng ( 134217727 )
    m_lOnBits(
27 =   CLng ( 268435455 )
    m_lOnBits(
28 =   CLng ( 536870911 )
    m_lOnBits(
29 =   CLng ( 1073741823 )
    m_lOnBits(
30 =   CLng ( 2147483647 )
    
    m_l2Power(
0 =   CLng ( 1 )
    m_l2Power(
1 =   CLng ( 2 )
    m_l2Power(
2 =   CLng ( 4 )
    m_l2Power(
3 =   CLng ( 8 )
    m_l2Power(
4 =   CLng ( 16 )
    m_l2Power(
5 =   CLng ( 32 )
    m_l2Power(
6 =   CLng ( 64 )
    m_l2Power(
7 =   CLng ( 128 )
    m_l2Power(
8 =   CLng ( 256 )
    m_l2Power(
9 =   CLng ( 512 )
    m_l2Power(
10 =   CLng ( 1024 )
    m_l2Power(
11 =   CLng ( 2048 )
    m_l2Power(
12 =   CLng ( 4096 )
    m_l2Power(
13 =   CLng ( 8192 )
    m_l2Power(
14 =   CLng ( 16384 )
    m_l2Power(
15 =   CLng ( 32768 )
    m_l2Power(
16 =   CLng ( 65536 )
    m_l2Power(
17 =   CLng ( 131072 )
    m_l2Power(
18 =   CLng ( 262144 )
    m_l2Power(
19 =   CLng ( 524288 )
    m_l2Power(
20 =   CLng ( 1048576 )
    m_l2Power(
21 =   CLng ( 2097152 )
    m_l2Power(
22 =   CLng ( 4194304 )
    m_l2Power(
23 =   CLng ( 8388608 )
    m_l2Power(
24 =   CLng ( 16777216 )
    m_l2Power(
25 =   CLng ( 33554432 )
    m_l2Power(
26 =   CLng ( 67108864 )
    m_l2Power(
27 =   CLng ( 134217728 )
    m_l2Power(
28 =   CLng ( 268435456 )
    m_l2Power(
29 =   CLng ( 536870912 )
    m_l2Power(
30 =   CLng ( 1073741824 )
    
    
    
Dim  x
    
Dim  k
    
Dim  AA
    
Dim  BB
    
Dim  CC
    
Dim  DD
    
Dim  a
    
Dim  b
    
Dim  c
    
Dim  d
    
    
Const  S11  =   7
    
Const  S12  =   12
    
Const  S13  =   17
    
Const  S14  =   22
    
Const  S21  =   5
    
Const  S22  =   9
    
Const  S23  =   14
    
Const  S24  =   20
    
Const  S31  =   4
    
Const  S32  =   11
    
Const  S33  =   16
    
Const  S34  =   23
    
Const  S41  =   6
    
Const  S42  =   10
    
Const  S43  =   15
    
Const  S44  =   21
    
If  Md5OLD  =   1   Then
        x 
=  ConvertToWordArray(sMessage)
    
Else
        x 
=  ConvertToWordArray(str2bin(sMessage))
    
End   If
    a 
=   & H67452301
    b 
=   & HEFCDAB89
    c 
=   & H98BADCFE
    d 
=   & H10325476
    
    
For  k  =   0   To   UBound (x) Step  16
        AA 
=  a
        BB 
=  b
        CC 
=  c
        DD 
=  d
        
        md5_FF a, b, c, d, x(k 
+   0 ), S11,  & HD76AA478
        md5_FF d, a, b, c, x(k 
+   1 ), S12,  & HE8C7B756
        md5_FF c, d, a, b, x(k 
+   2 ), S13,  & H242070DB
        md5_FF b, c, d, a, x(k 
+   3 ), S14,  & HC1BDCEEE
        md5_FF a, b, c, d, x(k 
+   4 ), S11,  & HF57C0FAF
        md5_FF d, a, b, c, x(k 
+   5 ), S12,  & H4787C62A
        md5_FF c, d, a, b, x(k 
+   6 ), S13,  & HA8304613
        md5_FF b, c, d, a, x(k 
+   7 ), S14,  & HFD469501
        md5_FF a, b, c, d, x(k 
+   8 ), S11,  & H698098D8
        md5_FF d, a, b, c, x(k 
+   9 ), S12,  & H8B44F7AF
        md5_FF c, d, a, b, x(k 
+   10 ), S13,  & HFFFF5BB1
        md5_FF b, c, d, a, x(k 
+   11 ), S14,  & H895CD7BE
        md5_FF a, b, c, d, x(k 
+   12 ), S11,  & H6B901122
        md5_FF d, a, b, c, x(k 
+   13 ), S12,  & HFD987193
        md5_FF c, d, a, b, x(k 
+   14 ), S13,  & HA679438E
        md5_FF b, c, d, a, x(k 
+   15 ), S14,  & H49B40821
        
        md5_GG a, b, c, d, x(k 
+   1 ), S21,  & HF61E2562
        md5_GG d, a, b, c, x(k 
+   6 ), S22,  & HC040B340
        md5_GG c, d, a, b, x(k 
+   11 ), S23,  & H265E5A51
        md5_GG b, c, d, a, x(k 
+   0 ), S24,  & HE9B6C7AA
        md5_GG a, b, c, d, x(k 
+   5 ), S21,  & HD62F105D
        md5_GG d, a, b, c, x(k 
+   10 ), S22,  & H2441453
        md5_GG c, d, a, b, x(k 
+   15 ), S23,  & HD8A1E681
        md5_GG b, c, d, a, x(k 
+   4 ), S24,  & HE7D3FBC8
        md5_GG a, b, c, d, x(k 
+   9 ), S21,  & H21E1CDE6
        md5_GG d, a, b, c, x(k 
+   14 ), S22,  & HC33707D6
        md5_GG c, d, a, b, x(k 
+   3 ), S23,  & HF4D50D87
        md5_GG b, c, d, a, x(k 
+   8 ), S24,  & H455A14ED
        md5_GG a, b, c, d, x(k 
+   13 ), S21,  & HA9E3E905
        md5_GG d, a, b, c, x(k 
+   2 ), S22,  & HFCEFA3F8
        md5_GG c, d, a, b, x(k 
+   7 ), S23,  & H676F02D9
        md5_GG b, c, d, a, x(k 
+   12 ), S24,  & H8D2A4C8A
        
        md5_HH a, b, c, d, x(k 
+   5 ), S31,  & HFFFA3942
        md5_HH d, a, b, c, x(k 
+   8 ), S32,  & H8771F681
        md5_HH c, d, a, b, x(k 
+   11 ), S33,  & H6D9D6122
        md5_HH b, c, d, a, x(k 
+   14 ), S34,  & HFDE5380C
        md5_HH a, b, c, d, x(k 
+   1 ), S31,  & HA4BEEA44
        md5_HH d, a, b, c, x(k 
+   4 ), S32,  & H4BDECFA9
        md5_HH c, d, a, b, x(k 
+   7 ), S33,  & HF6BB4B60
        md5_HH b, c, d, a, x(k 
+   10 ), S34,  & HBEBFBC70
        md5_HH a, b, c, d, x(k 
+   13 ), S31,  & H289B7EC6
        md5_HH d, a, b, c, x(k 
+   0 ), S32,  & HEAA127FA
        md5_HH c, d, a, b, x(k 
+   3 ), S33,  & HD4EF3085
        md5_HH b, c, d, a, x(k 
+   6 ), S34,  & H4881D05
        md5_HH a, b, c, d, x(k 
+   9 ), S31,  & HD9D4D039
        md5_HH d, a, b, c, x(k 
+   12 ), S32,  & HE6DB99E5
        md5_HH c, d, a, b, x(k 
+   15 ), S33,  & H1FA27CF8
        md5_HH b, c, d, a, x(k 
+   2 ), S34,  & HC4AC5665
        
        md5_II a, b, c, d, x(k 
+   0 ), S41,  & HF4292244
        md5_II d, a, b, c, x(k 
+   7 ), S42,  & H432AFF97
        md5_II c, d, a, b, x(k 
+   14 ), S43,  & HAB9423A7
        md5_II b, c, d, a, x(k 
+   5 ), S44,  & HFC93A039
        md5_II a, b, c, d, x(k 
+   12 ), S41,  & H655B59C3
        md5_II d, a, b, c, x(k 
+   3 ), S42,  & H8F0CCC92
        md5_II c, d, a, b, x(k 
+   10 ), S43,  & HFFEFF47D
        md5_II b, c, d, a, x(k 
+   1 ), S44,  & H85845DD1
        md5_II a, b, c, d, x(k 
+   8 ), S41,  & H6FA87E4F
        md5_II d, a, b, c, x(k 
+   15 ), S42,  & HFE2CE6E0
        md5_II c, d, a, b, x(k 
+   6 ), S43,  & HA3014314
        md5_II b, c, d, a, x(k 
+   13 ), S44,  & H4E0811A1
        md5_II a, b, c, d, x(k 
+   4 ), S41,  & HF7537E82
        md5_II d, a, b, c, x(k 
+   11 ), S42,  & HBD3AF235
        md5_II c, d, a, b, x(k 
+   2 ), S43,  & H2AD7D2BB
        md5_II b, c, d, a, x(k 
+   9 ), S44,  & HEB86D391
        
        a 
=  AddUnsigned(a, AA)
        b 
=  AddUnsigned(b, BB)
        c 
=  AddUnsigned(c, CC)
        d 
=  AddUnsigned(d, DD)
    
Next
    
    
if  stype = 32   then
    MD5 
=   LCase (WordToHex(a)  &  WordToHex(b)  &  WordToHex(c)  &  WordToHex(d))
    
else
    MD5
= LCase (WordToHex(b)  &  WordToHex(c))   ' I crop this to fit 16byte database password :D
     end   if
End Function
%>

 test.asp 测试页的内容

<!-- #include file=md5.asp -->

<%
response.write MD5(
" http://blog.sina.com.cn/juyonghong " , 32 )   ' 生成32位编码
response.write  " <br><br> "
response.write MD5(
" http://blog.sina.com.cn/juyonghong " , 16 ' 生成16位编码
%>

注:

1、由于MD5加密目前来说是不可逆的,即可以通过原始数据生成md5码后,但不能通过md5码还原数据。

2、虽然不可逆,但同一个字符串只能生成同样的一组md5码。

具体使用方法:(以用户注册、登录为例)

1、注册时,将md5(request.form("password"),16)的值存入数据库;

2、登录验证时,将数据库中存的md5码与md5("密码",16)比较。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值