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)比较。