Principio del algoritmo MD5 e implementación común

Definición

El nombre completo de MD es Message-Digest, es decir, resumen de mensaje, por lo que el algoritmo de la familia MD también se denomina algoritmo de resumen de mensaje. La
familia MD tiene MD2, MD3, MD4 y MD5, que es más fuerte que la generación.
Por lo tanto, MD5 es el algoritmo de cifrado más utilizado en la familia de algoritmos MD.

El algoritmo MD5 puede calcular cualquier información para generar un valor hash de 16 bytes (128 bits), pero el valor hash de 16 bytes no se puede usar para obtener información antes del cifrado.
Los 16 valores hash generalmente están representados por una cadena hexadecimal con una longitud de 32.
Esta es una de las características más importantes de MD5: el cifrado es irreversible.

MD5 características

El cifrado es irreversible, es decir, el texto original no se puede obtener a través del texto cifrado.
La inmutabilidad, es decir, el mismo texto original, el texto cifrado obtenido a través del algoritmo MD5 es siempre el mismo.
Hashability, es decir, ligeros cambios en el texto original, pueden cambiar completamente el texto cifrado final.

Escenarios de aplicación comunes

1. Verificar la integridad del archivo

Si Zhang San envía un archivo a Li Si, ¿cómo confirmar que el archivo está completo a Li Si?
Antes de que Zhang San transfiera el archivo, realice un cifrado MD5 en el archivo y luego pase el texto cifrado cifrado MD5 a Li
Si y Li Si Al recibir el archivo, el archivo también está cifrado con MD5. Si el texto cifrado obtenido es el mismo que el texto cifrado proporcionado por Zhang San, el archivo está completo.

2. Almacenar la contraseña del usuario

En teoría, las contraseñas de los usuarios no pueden almacenarse directamente en texto plano en la base de datos, porque una vez que la base de datos está descifrada, todas las contraseñas de los usuarios se pierden,
por lo que puede hacer un cifrado MD5 de la contraseña del usuario y luego almacenar el texto cifrado en la base de datos. Cuando el
usuario inicia sesión, puede MD5 cifra la contraseña del usuario y luego compara el texto cifrado con el texto cifrado en la base de datos para determinar si la contraseña completada en la recepción del usuario es correcta.
Esta es solo una forma de pensar, generalmente no tan simple, el entorno de producción general se ocupará de la contraseña del usuario más el cifrado de sal, etc., la información del usuario es más importante, requiere una lógica de cálculo más complicada.

Principio

El proceso de cifrado general de MD5 es definir primero cuatro valores y luego usar estos cuatro valores para calcular la información del texto original y obtener los cuatro valores nuevos, y luego calcular el texto original y obtener los cuatro valores nuevos. Valor, así que repita un cierto número de veces y finalmente realice una concatenación de cadenas simple de los últimos cuatro valores para obtener el texto cifrado final.
Los tres pasos principales son los siguientes:

1. Complete la información

Use la longitud del texto original para encontrar el resto de 512. Si el resultado no es 448, complete hasta 448 bits. El relleno es para completar el primer bit con 1, seguido de 0. 512-448 = 64, use los 64 bits restantes para registrar la longitud del texto original.
Finalmente obtenga un mensaje lleno (longitud total = longitud del texto original + 512 bits)

2. Obtenga el valor inicial

Los cuatro valores iniciales, definidos previamente por el algoritmo MD5, son cuatro valores de 32 bits, que son exactamente 128 bits.
Lo llamamos ABCD:
A = 0x01234567
B = 0x89ABCDEF
C = 0xFEDCBA98
D = 0x76543210

3. Cálculo real

El cálculo se divide en varios ciclos. Cada ciclo se llena con la información completada en el primer paso con ABCD y el texto original. Se realiza el cálculo y finalmente se obtiene un nuevo ABCD. Finalmente, el último ABCD se deletrea en una cadena, que es el texto cifrado final.
El bucle se divide primero en un bucle principal, y cada bucle principal se establece con un sub-bucle.
Número de bucles principales = longitud del texto original / 512.
Número de subciclos = 64 veces.

Veamos qué se hace en un solo sub-bucle:

La siguiente es la lógica de cálculo real de un solo sub-bucle (esta implementación se toma de los internautas): en la
Inserte la descripción de la imagen aquí
figura, A, B, C y D son cuatro grupos de valores hash. Cada ciclo hará que el viejo ABCD produzca un nuevo ABCD. ¿Cuántos ciclos hay en total? Determinado por la longitud del texto procesado.

Se supone que la longitud del texto original después del procesamiento es M
veces del bucle principal = M / 512.
Cada bucle principal contiene 512/32 * 4 = 64 sub-bucles.

La imagen de arriba muestra el flujo de un solo subciclo.

A continuación se explican los otros elementos en la figura uno por uno:

1. La F verde
en el gráfico F verde representa una función no lineal. Hay cuatro funciones utilizadas por el MD5 oficial:

F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =X^Y^Z
I(X, Y, Z)=Y^(X|(~Z))

En los 64 subciclos debajo del bucle principal, F, G, H, I se usan alternativamente, los primeros 16 usan F, los segundos 16 usan G, los terceros 16 usan H y los cuartos 16 Yo

2. La palabra "Tian"
en rojo es muy simple. La palabra "Tian" en rojo representa el significado de la suma.

3.
Mi Mi es el texto original después del primer paso. En el primer paso, la longitud del texto original después del procesamiento es un múltiplo entero de 512. Cada 512 bits del texto original se divide en 16 partes iguales, llamadas M0 ~ M15, cada longitud de parte igual es 32. En 64 subciclos, uno de M1 ~ M16 se usará alternativamente cada 16 ciclos.

4. Ki es
una constante. En 64 subciclos , la constante utilizada cada vez es diferente.

5. Amarillo <<
FF (a, b, c, d, Mj, s, ti) significa a = b + ((a + F (b, c, d) + Mj + ti) <<< s)
<< <s significa girar a la izquierda por s bits

第一轮
 a=FF(a,b,c,d,M0,7,0xd76aa478)
 b=FF(d,a,b,c,M1,12,0xe8c7b756)
 c=FF(c,d,a,b,M2,17,0x242070db)
 d=FF(b,c,d,a,M3,22,0xc1bdceee)
 a=FF(a,b,c,d,M4,7,0xf57c0faf)
 b=FF(d,a,b,c,M5,12,0x4787c62a)
 c=FF(c,d,a,b,M6,17,0xa8304613)
 d=FF(b,c,d,a,M7,22,0xfd469501)
 a=FF(a,b,c,d,M8,7,0x698098d8)
 b=FF(d,a,b,c,M9,12,0x8b44f7af)
 c=FF(c,d,a,b,M10,17,0xffff5bb1)
 d=FF(b,c,d,a,M11,22,0x895cd7be)
 a=FF(a,b,c,d,M12,7,0x6b901122)
 b=FF(d,a,b,c,M13,12,0xfd987193)
 c=FF(c,d,a,b,M14,17,0xa679438e)
 d=FF(b,c,d,a,M15,22,0x49b40821)
 
第二轮
 a=GG(a,b,c,d,M1,5,0xf61e2562)
 b=GG(d,a,b,c,M6,9,0xc040b340)
 c=GG(c,d,a,b,M11,14,0x265e5a51)
 d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
 a=GG(a,b,c,d,M5,5,0xd62f105d)
 b=GG(d,a,b,c,M10,9,0x02441453)
 c=GG(c,d,a,b,M15,14,0xd8a1e681)
 d=GG(b,c,d,a,M4,20,0xe7d3fbc8)
 a=GG(a,b,c,d,M9,5,0x21e1cde6)
 b=GG(d,a,b,c,M14,9,0xc33707d6)
 c=GG(c,d,a,b,M3,14,0xf4d50d87)
 d=GG(b,c,d,a,M8,20,0x455a14ed)
 a=GG(a,b,c,d,M13,5,0xa9e3e905)
 b=GG(d,a,b,c,M2,9,0xfcefa3f8)
 c=GG(c,d,a,b,M7,14,0x676f02d9)
 d=GG(b,c,d,a,M12,20,0x8d2a4c8a)
 
第三轮
 a=HH(a,b,c,d,M5,4,0xfffa3942)
 b=HH(d,a,b,c,M8,11,0x8771f681)
 c=HH(c,d,a,b,M11,16,0x6d9d6122)
 d=HH(b,c,d,a,M14,23,0xfde5380c)
 a=HH(a,b,c,d,M1,4,0xa4beea44)
 b=HH(d,a,b,c,M4,11,0x4bdecfa9)
 c=HH(c,d,a,b,M7,16,0xf6bb4b60)
 d=HH(b,c,d,a,M10,23,0xbebfbc70)
 a=HH(a,b,c,d,M13,4,0x289b7ec6)
 b=HH(d,a,b,c,M0,11,0xeaa127fa)
 c=HH(c,d,a,b,M3,16,0xd4ef3085)
 d=HH(b,c,d,a,M6,23,0x04881d05)
 a=HH(a,b,c,d,M9,4,0xd9d4d039)
 b=HH(d,a,b,c,M12,11,0xe6db99e5)
 c=HH(c,d,a,b,M15,16,0x1fa27cf8)
 d=HH(b,c,d,a,M2,23,0xc4ac5665)
 
第四轮
 a=II(a,b,c,d,M0,6,0xf4292244)
 b=II(d,a,b,c,M7,10,0x432aff97)
 c=II(c,d,a,b,M14,15,0xab9423a7)
 d=II(b,c,d,a,M5,21,0xfc93a039)
 a=II(a,b,c,d,M12,6,0x655b59c3)
 b=II(d,a,b,c,M3,10,0x8f0ccc92)
 c=II(c,d,a,b,M10,15,0xffeff47d)
 d=II(b,c,d,a,M1,21,0x85845dd1)
 a=II(a,b,c,d,M8,6,0x6fa87e4f)
 b=II(d,a,b,c,M15,10,0xfe2ce6e0)
 c=II(c,d,a,b,M6,15,0xa3014314)
 d=II(b,c,d,a,M13,21,0x4e0811a1)
 a=II(a,b,c,d,M4,6,0xf7537e82)
 b=II(d,a,b,c,M11,10,0xbd3af235)
 c=II(c,d,a,b,M2,15,0x2ad7d2bb)
 d=II(b,c,d,a,M9,21,0xeb86d391)

Por qué MD5 es irreversible

La razón por la cual MD5 es irreversible, en principio, la
primera es que usa una función hash, es decir, la función FGHI anterior.
El segundo es que usa muchas operaciones de turno, es decir <<<, estas son irreversibles. Por
ejemplo, hay 10110011, cambiamos a la izquierda tres lugares y nos convertimos en 10011000. 0 se reemplaza, entonces es absolutamente imposible usar 10011000 y luego revertir para obtener 10110011.

Implementación y uso de Java

public class MD5Util {
    public static void main(String[] args) throws IOException {
        System.out.println(encodeString("123"));
    }

    public static String encodeString(String plainText) throws UnsupportedEncodingException {
        return encodeBytes(plainText.getBytes("UTF-8"));
    }

    public static String encodeBytes(byte[] bytes) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(bytes);
            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

}
203 artículos originales publicados · elogiados 186 · 210,000 visitas

Supongo que te gusta

Origin blog.csdn.net/java_zhangshuai/article/details/105568316
Recomendado
Clasificación