¿Cómo escribir la función de cifrado MD5 usando VBA?
Llame al método 2 en la hoja de cálculo, como =MD5(A1, 32)
Abra Excel y presione Alt + F11, luego haga clic en Módulo en el menú Insertar, luego pegue todo el código anterior en el Módulo 1, luego guárdelo y ciérrelo para poder llamarlo en la celda.
Estos comentarios se pueden utilizar directamente copiando el código siguiente.
Constante privada BITS_TO_A_BYTE = 8
Constante privada BYTES_TO_A_WORD = 4
Constante privada BITS_TO_A_WORD = 32
M_lOnBits privados(30) p>
p>
Privada m_l2Power(30)
Función privada LShift(lValue, iShiftBits)
Si iShiftBits = 0, entonces
LShift = lValue
p>Salir de la función
Entonces ElseIf iShiftBits = 31
Si el valor l suma 1, entonces
LShift = & ampH80000000
Otro
LShift = 0
Finalizar si...
Salir de la función
ElseIf iShiftBits & lt0 o iShiftBits & gtThen 31
Uh. Suma 6
Terminará si...
Si (lValue y m_l2Power(31 - iShiftBits)) Entonces
LShift = ((lValue y m_lon bits (31-(iShiftBits+1)))* m _ L2 power(iShiftBits)) o & ampH80000000
Otro
LShift = ((lValor y m _ lon bits(31 - iShiftBits))* m _ L2 power(iShiftBits))
Terminará si...
Finalizar función
Función privada RShift(lValue, iShiftBits)
Si iShiftBits = 0, entonces
RShift = lValue
Salir de la función
ElseIf iShiftBits = 31
Si el valor l es & amp, entonces 80000000
RShift = 1
Otros
RShift = 0
Si... end
Salir de la función
De lo contrario, si iShiftBits & lt0 o iShiftBits & gtentonces 31
Uh.
Subir 6
Termina si (lvalue y & ampH80000000)
RShift = (RShift or (& amph 40000000 \m _ L2 power(iShiftBits-1)))
Terminará si...
Finalizar función
Función privada RotateLeft(lValue, iShiftBits)
RotateLeft = LShift(lValue, iShiftBits) o RS shift(lValue, (32 - iShiftBits)) p>
Función final
Función privada AddUnsigned(lX, lY)
Dim lX4
Atenuar lY4
Atenuar lX8
Atenuar lY8
Resultado difuso
lX8 = suma lX y ampH80000000
lY8 = lY suma & ampH80000000
lX4 = lX Y& ampH40000000
lY4 = lY Y & ampH40000000
lResultado = (lX Y& ampH3FFFFFFF ) + (lY And & ampH3FFFFFFF)
Si lX4 y lY4, entonces
lResult = lResult Xor & ampH80000000 Bar
lResult = lResult Xor & ampHC0000000 Xor lX8 Xor lY8
Otros
lResult = lResult Terminará si...
Otros
lResult = lResult Xor lX8 Xor lY8
Terminará si...
AddUnsigned = lResult
Finalizar función
Función privada md5_F(x, y, z)
md5_F = (x e y) o ((no x y 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)
Fin de función
Función privada md5_I(x, y, z)
md5_I = (y Xor (x o (no z)))
Finalizar función
Private Sub md5_FF(a, b, c, d, x, s, ac)
a = AddUnsigned(a, add unsigned(add unsigned(MD5_F(b,c,d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
Conector final
Sub privado md5_GG(a, b, c, d, x, s, ac)
a = AddUnsigned(a, agregar unsigned(agregar uns
igned(MD5_G(b,c,d),x),ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
Conector final
Private Sub md5_HH(a, b, c, d, x, s, ac)
a = AddUnsigned(a, add unsigned(add unsigned( MD5_H(b,c,d),x),ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
Conector final
Private Sub md5_II(a, b, c, d, x, s, ac)
a = AddUnsigned(a, add unsigned(add unsigned(MD5_I( b,c,d),x),ac))
a = GirarIzquierda(a, s)
a = AgregarSin firmar(a, b)
Conector final
Función privada ConvertToWordArray(sMessage)
Luz tenue
Palabra digital borrosa
Dim lWordArray()
Posición de deposición tenue
Dim lByteCount
Dim lWordCount
Módulo_bits constante = 512
Const CONGRUENT_BITS = 448
lMessageLength = Len(sMessage)
lnnumberofwords =(((lMessageLength+((modulo_bit-congruent_bit)\bit_to_words sección))\(modulo_bits\bits_to_bytes))+ 1) *(modulo_bits\bits_to_words) p>
ReDim lword array(lnumberoffwords-1)
lBytePosition = 0
lByteCount = 0
Hasta lByteCount & gt= lMessageLength
lWordCount = lByteCount \ BYTES _ A _ A _ WORD
lBytePosition =(lByteCount Mod BYTES _ A _ A _ WORD)* BITS _ A _ A _ BYTE
lword array(lWordCount)= lword array(lWordCount) o LShift(Asc (Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
lByteCount = lByteCount + 1
Anillo
lWordCount = lByteCount \ BYTES _ A _ A _ WORD
lBytePosition =(lByteCount Mod BYTES _ A _ A _ WORD)* BITS _ A _ A _ BYTE
lWordArray(lWordCount)= lWordArray(lWordCount) o l shift (& H80, lBytePosition)
lword array(lnumberoffwords-2) = lshift(lMessageLength, 3)
lword array (número dos
rds-1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
Función final
Función privada WordToHex (lvalue)
Dim lCount
Dim lCount
Para lCount = 0 a 3
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) y m_lon BITS(BITS _ TO _ A _ BYTE-1)
WordToHex = WordToHex &right(" 0 "&Hex (1 byte), 2)
Entonces
p>Finalizar función
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 _ lon bits(8) = CLng(511)
m_lOnBits(9) = CLng(1023)
m_lOnBits(10) = CLng(2047 )
m _ lon bits(11)= CLng(4095)
m _ lon bits(12)= CLng(8191)
m _ lon bits (13)= CLng(16383) p>
m_lOnBits(14) = CLng(32767)
m_lOnBits(15) = CLng(65535)
m _ lon bits(16)= CLng(131071)
m _ lon bits(17)= CLng(262143)
m _ lon bits(18)= CLng(524287)
m _ lon bits(19 )= CLng(1048575)
m _ lon bits(20)= CLng(2097151)
m _ lon bits(21)= CLng(4194303)
m_lOnBits(22) = CLng(8388607)
m _ lon bits(23) = CLng(16777215)
m _ lon bits (24)= CLng(33554431) p>
m _ lon bits(25)= CLng(67108863)
m _ lon bits(26)= CLng(134217727)
m_lOnBits(27) = CLng( 268435455)
m _ lon bits(28)= CLng(536870911)
m _ lon bits(29)= CLng(1073741823)
m _ lon bits(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_l2Potencia(8) = CLng(256)
m_l2Potencia(9) = CLng(512)
m _ Potencia L2(10)= CLng(1024) p>
m _ Potencia L2(11)= CLng(2048)
m_l2Potencia(12) = CLng(4096)
m _ Potencia L2(13)= CLng( 8192)
m _ Potencia L2(14) = CLng(16384)
m_l2Power(15) = CLng(32768)
m_l2Power(16) = CLng (65536)
m _ Potencia L2(17)= CLng(131072)
m _ Potencia L2(18)= CLng(262144)
m _ Potencia L2(19)= CLng(524288)
m _ Potencia L2(20)= CLng(1048576)
m _ Potencia L2(21)= CLng(2097152) p>
m _ Potencia L2(22)= CLng(4194304)
m_l2Potencia(23) = CLng(8388608)
m _ Potencia L2(24)= CLng( 16777216)
m_l2Potencia(25) = CLng(33554432)
m _ Potencia L2(26)= CLng(67108864)
m _ Potencia L2(27 )= CLng(134217728)
m_l2Power(28) = CLng(268435456)
m _ Potencia L2(29)= CLng(536870912)
m _ Potencia L2(30)= CLng(1073741824)
Tamaño x
Dim k
Dim AA
Dim BB
Dim CC
Dim DD
Dim
Dim b
Dim c
Tamaño d
Constante S11 = 7
Constante S12 = 12
Constante S13 = 17
Const S14 = 22
Const S21 = 5
Constante S22 = 9
Constante S23 = 14
Constante S24 = 20
Const S31 = 4< / p>
Const S32 = 11
Const S33 = 16
Constante S34 = 23
Const S41 = 6
Const S42 = 10
Const S43 = 15
Constante S44 = 21
x = ConvertToWordArray(sMessage)
a = & ampH674523
01
b = & ampHEFCDAB89
c = & ampH98BADCFE
d = & ampH10325476
Para k = 0 al límite inferior ( x) Paso 16
AA = a
BB = b
CC = c
DD = d
md5_FF a, b, c, d, x(k + 0), S11 y ampHD76AA478
md5_FF d, a, b, c, x(k + 1), S12 y ampHE8C7B756 p>
md5_FF c, d, a, b, x(k + 2), S13 y ampH242070DB
md5_FF b, c, d, a, x(k + 3), S14, & ampHC 1 BDC ee
md5_FF a, b, c, d, x(k + 4), S11, & ampHF57C0FAF
md5_FF d, a, b, c, x( k + 5), S12 y ampH4787C62A
md5_FF c, d, a, b, x(k + 6), S13 y ampHA8304613
md5_FF b, c, d, a, x(k + 7), S14 y ampHFD469501
md5_FF a, b, c, d, x(k + 8), S11 y ampH698098D8
md5_FF d, a, b, c, x(k + 9), S12 y ampH8B44F7AF
md5_FF c, d, a, b, x(k + 10), S13 y ampHFFFF5BB1
md5_FF b, c, d, a, x(k + 11), S14 y ampH895CD7BE
md5_FF a, b, c, d, x(k + 12), S11 y ampH6B901122 p>
md5_FF d, a, b, c, x(k + 13), S12 y ampHFD987193
md5_FF c, d, a, b, x(k + 14), S13, & ampHA679438E
md5_FF b, c, d, a, x(k + 15), S14, & ampH49B40821
md5_GG a, b, c, d, x(k + 1 ), S21 y ampHF61E2562
md5_GG d, a, b, c, x(k + 6), S22 y ampHC040B340
md5_GG c, d, a, b, x (k + 11), S23 y ampH265E5A51
md5_GG b, c, d, a, x(k + 0), S24 y ampHE9B6C7AA
md5_GG a, b, c , d , x(k + 5), S21. HD62F105D
md5_GG d, a, b, c, x(k + 10), S22 y ampH2441453
md5_GG c, d, a, b, x(k + 15) , S23 y ampHD8A1E681
md5_GG b, c, d, a, x(k + 4), S24 y ampHE7D3FBC8
md5_GG a, b, c, d, x( k+9), S21.
H21E1CDE6
md5_GG d,a,b,c,x(k+14),S22 y ampHC33707D6
md5_GG c,d,a,b,x(k+3) , S23 y ampHF4D50D87
md5_GG b, c, d, a, x(k + 8), S24 y ampH455A14ED
md5_GG a, b, c, d, x( k + 13), S21 y ampHA9E3E905
md5_GG d, a, b, c, x (k + 2), S22 y ampHFCEFA3F8
md5_GG c, d, a, b, x(k + 7), S23 y ampH676F02D9
md5_GG b, c, d, a, x(k + 12), S24 y ampH8D2A4C8A
md5_HH a, b, c, d, x(k + 5), S31. HFFFA3942
md5_HH d, a, b, c, x(k + 8), S32 y ampH8771F681
md5_HH c, d, a, b, x(k + 11) , S33 y ampH6D9D6122
md5_HH b, c, d, a, x(k + 14), S34 y ampHFDE5380C
md5_HH a, b, c, d, x( k + 1), S31, & ampha4a beea 44
md5_HH d, a, b, c, x (k + 4), S32, & ampH4BDECFA9
md5_HH c, d, a, b, x(k + 7), S33 y ampHF6BB4B60
md5_HH b, c, d, a, x(k + 10), S34 y ampHBEBFBC70
md5_HH a, b, c, d, x(k + 13), S31 y ampH289B7EC6
md5_HH d, a, b, c, x(k + 0), S32 y ampHEAA127FA
md5_HH c, d, a, b, x(k + 3), S33 y ampHD4EF3085
md5_HH b, c, d, a, x(k + 6), S34 y ampH4881D05
md5_HH a, b, c, d, x(k + 9), S31. HD9D4D039
md5_HH d,a,b,c,x(k+12),S32, & ampHE6DB99E5
md5_HH c,d,a,b,x(k+15) , S33 y ampH1FA27CF8
md5_HH b, c, d, a, x(k + 2), S34 y ampHC4AC5665
md5_II a, b, c, d, x( k+0), S41.
HF4292244
md5_II d, a, b, c, x(k + 7), S42 y ampH432AFF97
md5_II c, d, a, b, x(k + 14) , S43 y ampHAB9423A7
md5_II b, c, d, a, x(k + 5), S44 y ampHFC93A039
md5_II a, b, c, d, x( k + 12), S41 y ampH655B59C3
md5_II d, a, b, c, x(k + 3), S42 y ampH8F0CCC92
md5_II c, d, a, b, x(k + 10), S43 y ampHFFEFF47D
md5_II b, c, d, a, x(k + 1), S44 y ampH85845DD1
md5_II a, b, c, d, x(k + 8), S41. H6FA87E4F
md5_II d, a, b, c, x(k + 15), S42 y ampHFE2CE6E0
md5_II c, d, a, b, x(k + 6) , S43 y ampHA3014314
md5_II b, c, d, a, x(k + 13), S44 y ampH4E0811A1
md5_II a, b, c, d, x( k+4), S41. HF7537E82
md5_II d, a, b, c, x(k + 11), S42 y ampHBD3AF235
md5_II c, d, a, b, x(k + 2) , S43 y ampH2AD7D2BB
md5_II b, c, d, a, x(k + 9), S44 y ampHEB86D391
a = AddUnsigned(a,AA)
b = AddUnsigned(b, BB)
c = AddUnsigned(c, CC)
d = AddUnsigned(d, DD)
Entonces
Si stype = 32 entonces
MD5 = LCase(WordToHex(a)&WordToHex(b)&WordToHex(c)&WordToHex(d))
Otros
MD5 = LCase(WordToHex(b)&;WordToHex(c))
Terminará si...
Finalizar función
Lo siguiente es para probar, puedes conservarlo.
Subtest()
Marcar I como una cadena
i = InputBox("Ingrese la contraseña:")
Si MD5( i, 32) = MD5("abc ", 32) o MD5(i, 16) = MD5("abc ", 16) entonces: MsgBox "Ok ": De lo contrario: MsgBox "falló": Fin
MsgBox MD5("abc ",16)" devuelve letras minúsculas de 16 dígitos.
MsgBox MD5("abc",32)" devuelve letras minúsculas de 32 dígitos.
Conector final
Llamar al método 1 en la hoja de cálculo, por ejemplo =MD5(A1, 16)
Llamar al método 2 en la hoja de cálculo, por ejemplo =MD5 (A1, 32)
Abra Excel y presione Alt+F11, luego haga clic en Módulo en el menú Insertar, luego pegue todo el código anterior en el Módulo 1, luego guárdelo y ciérrelo para poder llamarlo en el celúla .