日期:2008-10-12  浏览次数:21003 次

MD5算法说明
1、MD5算法是对输入的数据进行补位。使得如果数据位长度LEN对512求余的结果是448。即数据圹展至K*512+448位。即K*64+56个字节,K为整数。具体补位操作:


补一个1 然后补0至满足上述要求

2、补数据长度

用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时数据就被填成长度为512位的倍数。

3、初始化MD5参数

四个32位整数(A,B,C,D)用来计算信息摘要,初始化使用的是十六进制表示的数字A=0X01234567
B=0X89abcdef
c=0Xfedcba98
D=0X76543210
4、处理位操作函数
X。Y。Z为32位整数

F(X.Y.Z) = XYINOT[X]
g(X.y.z) = XZIY?[Z]
h(x.y.z) = X xor Y xor Z
I(X.Y.Z) = X xor (XInot(z))

5、主要变换过程:
使用常数组T[1......64].T[i]为32位整数用6进制表示.数据用16个32位的整数数组M[]表示.

具体过程如下:

/*处理数据原文*/

For i = 0 to N /16-1 DO

/*每一次 把数据原文存在16个元素的数组X中。*/

For i=0 to 15 do
set X[i] to M[i*16+J]

END /结束对J的循环
/* SAVE A AS AA,B AS BB,C AS CC,AND D AS DD。*/

AA=A
BB=B
CC=C
DD=D

/*第1轮*/
/* 以[ABCD K S I]表示如下操作

A=B+((a+F(b,c,d)+X[k]+T[i])<<<s).*/
/* do the following 16 operations.*/

[abcd 0 7 1][dabc 1 12 2][CDAB 2 17 3][BCDA 3 22 4]
[abcd 4 7 5][dabc 5 12 6][CDAB 6 17 7][BCDA 7 22 8]
[ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][BCDA 11 22 12]
[ABCD 12 7 13][DABC 13 12 14][[CDAB 14 17 15][BCDA 15 22 16]

/*第2轮****/

/* 以[ABCD K S I]表示如下操作

A =B+(((A+G(B,C,D)+[K]+t[i]<<<S).*/

/* do THE FOLLWING 16 OPERATIONS.*/

[abcd 1 5 17][DABc 6 9 18[cdab 11 14 19][bcda 0 20 20]
[abcd 5 5 21][dabc 10 9 22][CDAB 15 14 23][BCDA 4 20 24]
[ABCD 9 5 25][DABC 14 9 26][CDAB3 14 27][BCDA 4 20 24]
[ABCD 13 5 29][DABC 2 9 30][CDAB 7 14 31][BCDA 12 20 32]

第三轮*/

/*[ABCD K S I] A=B+((A+h(B,C,D)x[K]+T[I]<<<S)

[abcd 5 4 33][dabc 8 11 34][cdab 11 16 35][bcda 14 23 36]
[abcd 1 4 37][dabc 4 11 38][cdab 7 16 39][bcda 10 23 40]
[abcd 13 4 41][dabc 0 11 42][cdab 3 16 43][bcda 6 23 44]
[avcd 9 4 45][dabc 12 11 46][cdab 15 16 47][bcda 2 25 48]

下来就是四了

A=A+AA
B=B+BB
C=C+CC
D=D+DD
END结束对i的循环

下来加密就结束了~输出的结果就是我们看不清楚的16位加密了
下来大家可以用这个试试~
<%
''''''''********************************************md5算法开始****************************************
''''''''****** md5加密 ******** *********
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)

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 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