En varios sistemas de inicio de sesión, el cifrado md5 de las contraseñas de los usuarios es indispensable.
Digámoslo de esta manera, incluso si ve la contraseña de inicio de sesión del usuario a través de varios medios, no puede saber cuál es debido a esa serie de cosas extrañas. Esto es protección.
La operación de cifrado md5 es irreversible, lo que significa que no se puede calcular su apariencia original a través de esa cadena de cosas raras.
El siguiente es el código md5 completo. No entiendo el algoritmo. Llámelo directamente cuando lo necesite.
Const privado BITS_TO_A_BYTE = 8Const privado BYTES_TO_A_WORD = 4Const privado BITS_TO_A_WORD = 32 m_lOnBits privado(30)M_l2Power(30) Función privada LShift(lValue, iShiftBits)If iShiftBits = 0 ThenLShift = lValueExit FunctionElseIf iShiftBits = 31 ThenIf lValue y 1 ThenLShift = &H80000000ElseLShift = 0End IfExit FunctionElseIf iShiftBits < 0 o iShiftBits > 31 ThenErr.Raise 6End If If (lValue y m_l2Power(31 - iShiftBits)) ThenLShift = ((lValue y m_lOnBits( 31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) O &H80000000ElseLShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))End IfEnd Función Función privada RShift(lValue, iShiftBits)Si iShiftBits = 0 ThenRShift = Si (lValue y &H80000000) ThenRShift = (RShift Or (&H40000000 / m_l2Power(iShiftBits - 1)))End IfEnd Función Función privada RotateLeft(lValue, iShiftBits)RotateLeft = LShift(lValue, iShiftBits) O RShift(lValue, (32 - iShiftBits) )Fin Función privada AddUnsigned(lX, lY)Dim lX4Dim lY4Dim lX8Dim lY8Dim lResult lX8 = lX Y &H80000000lY8 = lY Y &H80000000lX4 = lX Y &H40000000lY4 = lY Y &H40000000 lResultado = (lX And &H3FFFFFF) + (lY Y &H3FFFFFFF) Si lX4 Y lY4 ThenlResult = lResult Xor &H80000000 Xor lX8 Xor lY8ElseIf lX4 O lY4 ThenIf lResult Y &H40000000 ThenlResult = lResult lX8 Xor lY8ElselResult = lResultado Xor &H40000000 Xor lX8 Xor lY8End IfElselResult = lResultado z)Función final Función privada md5_G(x, y, z)md5_G = (x y z) o (y y (no z))Función final función privada md5_H(x, y, z)md5_H = (x Xor y Xor z )Función final Función privada md5_I(x, y, z)md5_I = (y Xor (x o (no z)))Función final Sub privada 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 = Agregar sin firmar (a, Agregar sin firmar (Agregar sin firmar (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, Agregar sin firmar (Agregar sin firmar (md5_I (b, c, d), x), ac)) a = Rotar a la izquierda (a, s)a = AddUnsigned(a, b)End Sub Private Function ConvertToWordArray(sMessage)Dim lMessageLengthDim lNumberOfWordsDim lWordArray()Dim lBytePositionDim lByteCountDim lWordCount Const MODULUS_BITS = 512Const CONGRUENT_BITS = 448 lMessageLength = Len(sMessage) Número de palabras = (((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 = 0lByteCount = 0Hacer hasta lByteCount >= lMessageLengthlWordCount = lByteCount / BYTES_TO_A_WORDlBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTElWordArray(lWordCount) = lWordArray(lWordCount) O LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)lByteCount = lByteCount + 1Loop lWordCount = lByteCount / BYTES_TO_A_WORDlBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) O LShift(&H80, lBytePosition) lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) ConvertToWordArray = lWordArrayEnd Función Función privada WordToHex(lValue)Dim lByteDim lCount For lCount = 0 a 3lByte = RShift(l valor, lContar * BITS_TO_A_BYTE) Y m_lOnBits(BITS_TO_A_BYTE - 1)WordToHex = WordToHex & Right("0" & Hex(lByte), 2)Función NextEnd Función pública MD5(sMessage, estilo)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_l2Potencia(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) Atenuado S31 = 4Const S32 = 11Const S33 = 16Const S34 = 23Const S41 = 6Const S42 = 10Const S43 = 15Const S44 = 21 x = ConvertToWordArray(sMessage) a = &H67452301b = &HEFCDAB89c = &H98BADCFEd = &H10325476 Para k = 0 A UBound(x) Paso 16AA = aBB = bCC = cDD = d md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756md5_FF c, d, a, b, x(k + 2), S13, &H242070DBmd5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEEmd5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAFmd5_FF d, a, b, c, x(k + 5), S12, &H4787C62Amd5_FF c, d, a, b, x(k + 6), S13, &HA8304613md5_FF b, c, d, a, x(k + 7), S14, &HFD469501md5_FF a, b, c, d, x(k + 8 ), S11, &H698098D8md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AFmd5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1md5_FF b, c, d, a, x(k + 11 ), S14, &H895CD7BEmd5_FF a, b, c, d, x(k + 12), S11, &H6B901122md5_FF d, a, b, c, x(k + 13), S12, &HFD987193md5_FF c, d, a, b, x(k + 14 ), S13, &HA679438Emd5_FF b, c, d, a, x(k + 15), S14, &H49B40821 md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562md5_GG d, a, b, c, x(k + 6), S22, &HC040B340md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AAmd5_GG a, b, c, d, x(k + 5 ), S21, &HD62F105Dmd5_GG d, a, b, c, x(k + 10), S22, &H2441453md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681md5_GG b, c, d, a, x(k + 4 ), S24, &HE7D3FBC8md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6md5_GG c, d, a, b, x(k + 3 ), S23, &HF4D50D87md5_GG b, c, d, a, x(k + 8), S24, &H455A14EDmd5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905md5_GG d, a, b, c, x(k + 2 ), S22, &HFCEFA3F8md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A md5_HH a, b, c, d, x(k + 5 ), S31, &HFFFA3942md5_HH d, a, b, c, x(k + 8), S32, &H8771F681md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380Cmd5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FAmd5_HH c, d, a, b, x(k + 3) , S33, &HD4EF3085md5_HH b, c, d, a, x(k + 6), S34, &H4881D05md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5md5_HH c, d, a, b, x(k+15), S33, &H1FA27CF8md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665 md5_II a, b, c, d, x(k + 0), S41, &HF4292244md5_II d, a, b, c, x(k + 7), S42, &H432AFF97md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7md5_II b, c, d, a, x(k + 5), S44, &HFC93A039md5_II a, b, c, d, x(k + 12) , S41, &H655B59C3md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47Dmd5_II b, c, d, a, x(k + 1), S44, &H85845DD1md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4Fmd5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0md5_II c, d, a, b, x(k + 6), S43, &HA3014314md5_II b, c, d, a, x(k + 13 ), S44, &H4E0811A1md5_II a, b, c, d, x(k + 4), S41, &HF7537E82md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235md5_II c, d, a, b, x(k + 2 ), S43, &H2AD7D2BBmd5_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 )Siguiente Si tipo = 32 EntoncesMD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))ElseMD5 = LCase(WordToHex(b) & WordToHex(c))End IfEnd FunctionSub test()MsgBox MD5("a", 16) 'MsgBox cifrado de 16 bits MD5 ("a", 32) 'Cifrado de 32 bitsEnd Sub