Red de conocimiento informático - Material del sitio web - ¿Cómo escribir la función de cifrado MD5 usando VBA?

¿Cómo escribir la función de cifrado MD5 usando VBA?

Llame al método 1 en la hoja de cálculo, como =MD5(A1, 16)

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>

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

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)

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)

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)

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)

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)

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

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

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 .