Sí, no hay dramas, acá la tenés:
FUNCTION CryptMD5
PARAMETERS lcTexto
MD5=Createobject("MD5")
MD5.tohash = lcTexto
lcRetorno = MD5.Compute()
RETURN (lcRetorno)
Define Class MD5 As Custom OlePublic
**********************************************************************************************************************
* Une implémention en Visual Foxpro de l'algorithme MD5 message digest tel que definis dans le RFC 1321 par R. RIVEST
* de la société RSA DATA SECURTY & MIT Laboratory for Computer Science
* A VFP implementation of the RSA Data Security, Inc. MD5 Message Digest Algorithm, as defined in RFC 1321.
**********************************************************************************************************************
* Usage (sample)
* SET PROCEDURE TO mdigest5
* MD5=CREATEOBJECT("MD5")
* MD5.tohash="abc"
* ? MD5.compute()
*******************************
tohash=""
Dimension SinusArray(64)
#Define MAX_UINT 4294967296
#Define NUMBEROFBIT 8&& UNICODE 16 (unicode not tested)
Procedure Init
Local I
For I = 1 To 64
This.SinusArray(I)=Transform(MAX_UINT*Abs(Sin(I)),"@0")
This.SinusArray(I)=Bitand(Evaluate(This.SinusArray(I)),0xFFFFFFFF) &&CAST
Endfor
Return .T.
Procedure bourre
Local NBR_BIT_BOURRE, BOURRAGE
BOURRAGE = Chr(128)+Replicate(Chr(0),63)
NBR_BIT_BOURRE=(448-(Len(This.tohash)*NUMBEROFBIT)%512)/NUMBEROFBIT
If (Len(This.tohash)*NUMBEROFBIT)%512>=448
NBR_BIT_BOURRE=(448+((512-Len(This.tohash)*NUMBEROFBIT)%512))/NUMBEROFBIT
Endif
Return Left(BOURRAGE,NBR_BIT_BOURRE)
Procedure acompleter
Local retour,decalage
decalage=Transform(Len(This.tohash)* NUMBEROFBIT,"@0")
retour=""
retour=retour+Chr(Evaluate("0x"+Substr(decalage,9,2)))
retour=retour+Chr(Evaluate("0x"+Substr(decalage,7,2)))
retour=retour+Chr(Evaluate("0x"+Substr(decalage,5,2)))
retour=retour+Chr(Evaluate("0x"+Substr(decalage,3,2)))
retour=retour+Replicate(Chr(0),4)
Return retour
Procedure MD5_F
Lparameters x,Y,z
Return Bitor(Bitand(x,Y),Bitand(Bitnot(x),z))
Procedure MD5_G
Lparameters x,Y,z
Return Bitor(Bitand(x,z),Bitand(Y,Bitnot(z)))
Procedure MD5_H
Lparameters x,Y,z
Return Bitxor(x,Y,z)
Procedure MD5_I
Lparameters x,Y,z
Return Bitxor(Y,Bitor(x,Bitnot(z)))
Procedure ROTATE_LEFT
Lparameters Pivot, npivot
Return Bitor(Bitlshift(Pivot,npivot),Bitrshift(Pivot,32-npivot))
Procedure ronde1
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_F(PB,PC,PD)+PE+PG,PF)
Procedure ronde2
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_G(PB,PC,PD)+PE+PG,PF)
Procedure ronde3
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_H(PB,PC,PD)+PE+PG,PF)
Procedure ronde4
Lparameters PA,PB,PC,PD,PE,PF,PG
Return PB+This.ROTATE_LEFT(PA+This.MD5_I(PB,PC,PD)+PE+PG,PF)
Procedure Compute
Local tocompute,CPT_I,CPT_J,CPT_L,TMP_STRING,AA,BB,CC,DD,a,b,c,d,AA,BB,CC,DD
a=Bitand(0x67452301,0xFFFFFFFF)
b=Bitand(0xEFCDAB89,0xFFFFFFFF)
c=Bitand(0x98BADCFE,0xFFFFFFFF)
d=Bitand(0x10325476,0xFFFFFFFF)
Dimension T_X(16)
tocompute=This.tohash+This.bourre()+This.acompleter()
lentocompute=Len(tocompute)/64
OldA=a
OldB=b
OldC=c
OldD=d
For CPT_I=0 To lentocompute-1
For CPT_J=0 To 15
T_X(CPT_J+1)=""
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+4,1)),"@0"),2)
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+3,1)),"@0"),2)
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+2,1)),"@0"),2)
T_X(CPT_J+1)=T_X(CPT_J+1)+Right(Transform(Asc(Substr(tocompute,(CPT_I*64)+(CPT_J*4)+1,1)),"@0"),2)
T_X(CPT_J+1)=Bitand(Evaluate("0x"+T_X(CPT_J+1)),0xFFFFFFFF) && CAST
*? TRANSFORM(T_X(CPT_J+1),"@0")
*?
Endfor
OldA=a
OldB=b
OldC=c
OldD=d
&& Ronde1
a=This.ronde1(a,b,c,d,T_X( 1), 7,This.SinusArray( 1))
d=This.ronde1(d,a,b,c,T_X( 2),12,This.SinusArray( 2))
c=This.ronde1(c,d,a,b,T_X( 3),17,This.SinusArray( 3))
b=This.ronde1(b,c,d,a,T_X( 4),22,This.SinusArray( 4))
a=This.ronde1(a,b,c,d,T_X( 5), 7,This.SinusArray( 5))
d=This.ronde1(d,a,b,c,T_X( 6),12,This.SinusArray( 6))
c=This.ronde1(c,d,a,b,T_X( 7),17,This.SinusArray( 7))
b=This.ronde1(b,c,d,a,T_X( 8),22,This.SinusArray( 8))
a=This.ronde1(a,b,c,d,T_X( 9), 7,This.SinusArray( 9))
d=This.ronde1(d,a,b,c,T_X(10),12,This.SinusArray(10))
c=This.ronde1(c,d,a,b,T_X(11),17,This.SinusArray(11))
b=This.ronde1(b,c,d,a,T_X(12),22,This.SinusArray(12))
a=This.ronde1(a,b,c,d,T_X(13), 7,This.SinusArray(13))
d=This.ronde1(d,a,b,c,T_X(14),12,This.SinusArray(14))
c=This.ronde1(c,d,a,b,T_X(15),17,This.SinusArray(15))
b=This.ronde1(b,c,d,a,T_X(16),22,This.SinusArray(16))
&& ronde 2
a=This.ronde2(a,b,c,d,T_X( 2), 5,This.SinusArray(17))
d=This.ronde2(d,a,b,c,T_X( 7), 9,This.SinusArray(18))
c=This.ronde2(c,d,a,b,T_X(12),14,This.SinusArray(19))
b=This.ronde2(b,c,d,a,T_X( 1),20,This.SinusArray(20))
a=This.ronde2(a,b,c,d,T_X( 6), 5,This.SinusArray(21))
d=This.ronde2(d,a,b,c,T_X(11), 9,This.SinusArray(22))
c=This.ronde2(c,d,a,b,T_X(16),14,This.SinusArray(23))
b=This.ronde2(b,c,d,a,T_X( 5),20,This.SinusArray(24))
a=This.ronde2(a,b,c,d,T_X(10), 5,This.SinusArray(25))
d=This.ronde2(d,a,b,c,T_X(15), 9,This.SinusArray(26))
c=This.ronde2(c,d,a,b,T_X( 4),14,This.SinusArray(27))
b=This.ronde2(b,c,d,a,T_X( 9),20,This.SinusArray(28))
a=This.ronde2(a,b,c,d,T_X(14), 5,This.SinusArray(29))
d=This.ronde2(d,a,b,c,T_X( 3), 9,This.SinusArray(30))
c=This.ronde2(c,d,a,b,T_X( 8),14,This.SinusArray(31))
b=This.ronde2(b,c,d,a,T_X(13),20,This.SinusArray(32))
&& ronde 3
a=This.ronde3(a,b,c,d,T_X( 6), 4,This.SinusArray(33))
d=This.ronde3(d,a,b,c,T_X( 9),11,This.SinusArray(34))
c=This.ronde3(c,d,a,b,T_X(12),16,This.SinusArray(35))
b=This.ronde3(b,c,d,a,T_X(15),23,This.SinusArray(36))
a=This.ronde3(a,b,c,d,T_X( 2), 4,This.SinusArray(37))
d=This.ronde3(d,a,b,c,T_X( 5),11,This.SinusArray(38))
c=This.ronde3(c,d,a,b,T_X( 8),16,This.SinusArray(39))
b=This.ronde3(b,c,d,a,T_X(11),23,This.SinusArray(40))
a=This.ronde3(a,b,c,d,T_X(14), 4,This.SinusArray(41))
d=This.ronde3(d,a,b,c,T_X( 1),11,This.SinusArray(42))
c=This.ronde3(c,d,a,b,T_X( 4),16,This.SinusArray(43))
b=This.ronde3(b,c,d,a,T_X( 7),23,This.SinusArray(44))
a=This.ronde3(a,b,c,d,T_X(10), 4,This.SinusArray(45))
d=This.ronde3(d,a,b,c,T_X(13),11,This.SinusArray(46))
c=This.ronde3(c,d,a,b,T_X(16),16,This.SinusArray(47))
b=This.ronde3(b,c,d,a,T_X( 3),23,This.SinusArray(48))
&& ronde 4
a=This.ronde4(a,b,c,d,T_X( 1), 6,This.SinusArray(49))
d=This.ronde4(d,a,b,c,T_X( 8),10,This.SinusArray(50))
c=This.ronde4(c,d,a,b,T_X(15),15,This.SinusArray(51))
b=This.ronde4(b,c,d,a,T_X( 6),21,This.SinusArray(52))
a=This.ronde4(a,b,c,d,T_X(13), 6,This.SinusArray(53))
d=This.ronde4(d,a,b,c,T_X( 4),10,This.SinusArray(54))
c=This.ronde4(c,d,a,b,T_X(11),15,This.SinusArray(55))
b=This.ronde4(b,c,d,a,T_X( 2),21,This.SinusArray(56))
a=This.ronde4(a,b,c,d,T_X( 9), 6,This.SinusArray(57))
d=This.ronde4(d,a,b,c,T_X(16),10,This.SinusArray(58))
c=This.ronde4(c,d,a,b,T_X( 7),15,This.SinusArray(59))
b=This.ronde4(b,c,d,a,T_X(14),21,This.SinusArray(60))
a=This.ronde4(a,b,c,d,T_X( 5), 6,This.SinusArray(61))
d=This.ronde4(d,a,b,c,T_X(12),10,This.SinusArray(62))
c=This.ronde4(c,d,a,b,T_X( 3),15,This.SinusArray(63))
b=This.ronde4(b,c,d,a,T_X(10),21,This.SinusArray(64))
a=a+OldA
b=b+OldB
c=c+OldC
d=d+OldD
Endfor
a=Transform(Bitand(a,0xFFFFFFFF),"@0") && cast
b=Transform(Bitand(b,0xFFFFFFFF),"@0") && cast
c=Transform(Bitand(c,0xFFFFFFFF),"@0") && cast
d=Transform(Bitand(d,0xFFFFFFFF),"@0") && cast
a=Substr(a,9,2)+Substr(a,7,2)+Substr(a,5,2)+Substr(a,3,2)
b=Substr(b,9,2)+Substr(b,7,2)+Substr(b,5,2)+Substr(b,3,2)
c=Substr(c,9,2)+Substr(c,7,2)+Substr(c,5,2)+Substr(c,3,2)
d=Substr(d,9,2)+Substr(d,7,2)+Substr(d,5,2)+Substr(d,3,2)
Return a+b+c+d
Enddefine