Saltar al contenido
El bit perdido
Newsletter

Lección 5 de 13

DES visto desde arriba: 16 rondas de Feistel

El esquema completo de DES: permutación inicial, 16 rondas de Feistel, intercambio y permutación final, con un cifrado real calculado ronda a ronda.

Al terminar sabrás:

  • Contar la historia de DES y sus parámetros: bloque de 64 bits, clave de 56 y 16 rondas
  • Describir el esquema completo: IP, 16 rondas, intercambio de mitades e IP inversa
  • Aplicar la permutación inicial a un bloque real y seguir los 16 pares (L, R)
  • Explicar por qué IP e IP inversa no añaden seguridad

Si sabes qué es un número en binario y sumar módulo 2 (sin llevadas), puedes seguirlo. Lo demás (hexadecimal, XOR, permutaciones, polinomios módulo 2 y cuerpos finitos) se explica sobre la marcha.

En la lección anterior montamos una red de Feistel de juguete con bloques de 8 bits y tres rondas. Ahora pasamos a la de verdad. Es el cifrado que reinó dos décadas como estándar: DES (Data Encryption Standard). En el relato del curso, DES es el primer cifrado de bloque con el que Alicia puede mandar datos a Bernardo sin que Eva los lea, siempre que ella no pruebe todas las claves. Esa última condición será la causa de su caída, pero eso llegará en la lección 8.

Hoy vemos DES desde arriba: qué es, de dónde sale y cómo encajan sus piezas. La función ff de cada ronda y las subclaves quedan para las lecciones 6 y 7. Con eso, y con un ejemplo completo calculado de principio a fin, tendrás el mapa entero.

La idea

DES es una red de Feistel de 16 rondas. Toma un bloque de 64 bits y una clave, y devuelve otro bloque de 64 bits. Dentro, hace lo mismo que el juguete de la lección 4: parte el bloque en dos mitades de 32 bits, LL y RR, y en cada ronda mezcla una mitad con una función de la otra.

Hay tres diferencias con el juguete. Los bloques son de 64 bits, así que 2642^{64} bloques posibles. La función ff es mucho más elaborada: expande, mezcla con la clave, pasa por ocho cajas S y permuta. Y la clave no se usa tal cual: de ella salen 16 subclaves K1,…,K16K_1,\dots,K_{16}, una por ronda.

Además, antes de la primera ronda y después de la última hay una permutación fija de los 64 bits. No añade seguridad criptográfica (cualquiera puede deshacerla, no lleva clave), pero está en el estándar y hay que respetarla para obtener los mismos criptogramas que todo el mundo.

Un poco de historia

A principios de los años setenta, la agencia estadounidense NBS (National Bureau of Standards, hoy NIST) buscaba un cifrado común para proteger los datos no clasificados del Gobierno, durante su transmisión y almacenados. IBM presentó un cifrado de bloque de tipo Feistel, heredero de su sistema Lucifer, y la agencia de seguridad NSA participó en la evaluación. El resultado se adoptó como estándar federal en 1977 con el nombre de FIPS 46. El documento fue revisado varias veces; la última versión, FIPS 46-3 (1999), es la que usamos como referencia en este curso y está retirada desde 2005.

La polémica empezó enseguida. Se criticó que la clave fuera de solo 56 bits efectivos, y que la NSA hubiera intervenido en el diseño sin que los criterios de las cajas S fueran públicos. En 1994 Don Coppersmith, uno de los diseñadores de IBM, publicó los criterios que se habían seguido para esas cajas, y contó que formaban parte del diseño original. Volveremos sobre ello en la lección 6.

Parámetros

  • Bloque: 64 bits.
  • Clave: 64 bits, de los que 8 son de paridad y no entran en el cifrado. La clave efectiva es de 56 bits, es decir, 2562^{56} claves posibles. Lo vemos en la lección 7.
  • Rondas: 16, con una subclave de 48 bits en cada una.
  • Estructura: red de Feistel.

Aviso de notación. DES, como el estándar FIPS 46-3, numera los bits de 1 a 64 empezando por la izquierda: el bit 1 es el más significativo. Todas las tablas del estándar usan esta numeración, y nosotros también.

El esquema completo

Sea MM el bloque de entrada y KK la clave. Cifrar es:

  1. Permutación inicial. Se reordenan los 64 bits de MM con la permutación IPIP. Se parte el resultado en L0L_0 (32 bits de la izquierda) y R0R_0 (32 de la derecha).
  2. Dieciséis rondas. Para i=1,…,16i = 1,\dots,16:
Li=Ri−1,Ri=Li−1⊕f(Ri−1,Ki).L_i = R_{i-1}, \qquad R_i = L_{i-1} \oplus f(R_{i-1}, K_i).
  1. Intercambio. Se juntan las mitades al revés: R16L16R_{16}L_{16}.
  2. Permutación final. Se aplica IP−1IP^{-1} (la inversa de IPIP), y sale el criptograma cc.

Como en el juguete de la lección 4, el intercambio del paso 3 hace que descifrar sea cifrar con las subclaves en orden inverso, K16,…,K1K_{16},\dots,K_1: no hace falta un circuito distinto para descifrar.

La permutación inicial

IPIP se da como una lista de 64 posiciones: el bit de salida número jj es el bit número IP[j]IP[j] de la entrada. Escrita por filas de 8, es:

585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157

La primera fila dice: el bit 1 de la salida es el bit 58 de la entrada, el bit 2 de la salida es el 50 de la entrada, etc. Las cuatro primeras filas llenan la mitad izquierda L0L_0 y las cuatro últimas la derecha R0R_0. Mira un detalle: L0L_0 se forma con los bits de posición par de la entrada y R0R_0 con los de posición impar.

Su inversa IP−1IP^{-1} tiene la tabla opuesta, que empieza por 40,8,48,16,56,24,64,3240, 8, 48, 16, 56, 24, 64, 32 (el bit 1 de la salida es el bit 40 de la entrada).

Ejemplo resuelto

Usamos el ejemplo de J. Orlin Grabbe, «The DES Algorithm Illustrated», muy difundido para seguir DES a mano. Es un ejemplo de ese texto (fechado en 1998), y las cifras de abajo las hemos recalculado nosotros paso a paso. Tomamos, en hexadecimal,

K=133457799BBCDFF1,M=0123456789ABCDEF.K = \texttt{133457799BBCDFF1}, \qquad M = \texttt{0123456789ABCDEF}.

Paso 1: MM en bits. Escribimos MM por bytes:

bytehexbits
101\texttt{01}0000000100000001
223\texttt{23}0010001100100011
345\texttt{45}0100010101000101
467\texttt{67}0110011101100111
589\texttt{89}1000100110001001
6AB\texttt{AB}1010101110101011
7CD\texttt{CD}1100110111001101
8EF\texttt{EF}1110111111101111

Paso 2: IP(M)IP(M). Aplicamos la tabla. El bit 1 de la salida es el bit 58 de la entrada (el bit 58 es el segundo bit del byte 8, y vale 1), y así hasta 64 bits. Resulta:

bytebitshex
11100110011001100CC\texttt{CC}
2000000000000000000\texttt{00}
31100110011001100CC\texttt{CC}
41111111111111111FF\texttt{FF}
51111000011110000F0\texttt{F0}
61010101010101010AA\texttt{AA}
71111000011110000F0\texttt{F0}
81010101010101010AA\texttt{AA}

Partimos en mitades:

L0=CC00CCFF,R0=F0AAF0AA.L_0 = \texttt{CC00CCFF}, \qquad R_0 = \texttt{F0AAF0AA}.

Paso 3: las 16 rondas. En la lección 6 calcularemos con todo detalle la ronda 1. De momento usamos los valores de f(Ri−1,Ki)f(R_{i-1}, K_i) para ver que la recurrencia funciona. No puedes comprobarlos todavía: la lección 6 te dará las herramientas para la ronda 1. Ya con f1=f(R0,K1)=234AA9BBf_1 = f(R_0, K_1) = \texttt{234AA9BB}:

R1=L0⊕f1=CC00CCFF⊕234AA9BB=EF4A6544,L1=R0=F0AAF0AA.R_1 = L_0 \oplus f_1 = \texttt{CC00CCFF} \oplus \texttt{234AA9BB} = \texttt{EF4A6544}, \qquad L_1 = R_0 = \texttt{F0AAF0AA}.

Compruébalo byte a byte: CC⊕23=EF\texttt{CC}\oplus\texttt{23} = \texttt{EF}, 00⊕4A=4A\texttt{00}\oplus\texttt{4A} = \texttt{4A}, CC⊕A9=65\texttt{CC}\oplus\texttt{A9} = \texttt{65}, FF⊕BB=44\texttt{FF}\oplus\texttt{BB} = \texttt{44}.

La tabla recoge todas las rondas:

ronda iif(Ri−1,Ki)f(R_{i-1},K_i)LiL_iRiR_i
0CC00CCFF\texttt{CC00CCFF}F0AAF0AA\texttt{F0AAF0AA}
1234AA9BB\texttt{234AA9BB}F0AAF0AA\texttt{F0AAF0AA}EF4A6544\texttt{EF4A6544}
23CAB87A3\texttt{3CAB87A3}EF4A6544\texttt{EF4A6544}CC017709\texttt{CC017709}
34D166EB0\texttt{4D166EB0}CC017709\texttt{CC017709}A25C0BF4\texttt{A25C0BF4}
4BB23774C\texttt{BB23774C}A25C0BF4\texttt{A25C0BF4}77220045\texttt{77220045}
52813ADC3\texttt{2813ADC3}77220045\texttt{77220045}8A4FA637\texttt{8A4FA637}
69E45CD2C\texttt{9E45CD2C}8A4FA637\texttt{8A4FA637}E967CD69\texttt{E967CD69}
78C051C27\texttt{8C051C27}E967CD69\texttt{E967CD69}064ABA10\texttt{064ABA10}
83C0E86F9\texttt{3C0E86F9}064ABA10\texttt{064ABA10}D5694B90\texttt{D5694B90}
922367C6A\texttt{22367C6A}D5694B90\texttt{D5694B90}247CC67A\texttt{247CC67A}
1062BC9C22\texttt{62BC9C22}247CC67A\texttt{247CC67A}B7D5D7B2\texttt{B7D5D7B2}
11E104FA02\texttt{E104FA02}B7D5D7B2\texttt{B7D5D7B2}C5783C78\texttt{C5783C78}
12C268CFEA\texttt{C268CFEA}C5783C78\texttt{C5783C78}75BD1858\texttt{75BD1858}
13DDBB2922\texttt{DDBB2922}75BD1858\texttt{75BD1858}18C3155A\texttt{18C3155A}
14B7318E55\texttt{B7318E55}18C3155A\texttt{18C3155A}C28C960D\texttt{C28C960D}
155B81276E\texttt{5B81276E}C28C960D\texttt{C28C960D}43423234\texttt{43423234}
16C8C04F98\texttt{C8C04F98}43423234\texttt{43423234}0A4CD995\texttt{0A4CD995}

Fíjate en la columna LiL_i: es la columna RiR_i desplazada una fila hacia abajo. Eso es la Feistel, que se limita a mover RR a la izquierda en cada ronda.

Paso 4: intercambio y IP−1IP^{-1}. Se juntan las mitades al revés:

R16L16=0A4CD995 43423234.R_{16}L_{16} = \texttt{0A4CD995}\,\texttt{43423234}.

Aplicamos IP−1IP^{-1} y sale el criptograma

c=85E813540F0AB405.c = \texttt{85E813540F0AB405}.

Solo nos falta ver cómo se calcula cada ff y cada subclave. Eso haremos en las dos lecciones siguientes.

Ejercicios

Ejercicio 1

Aplica IPIP a los bloques 0000000000000001\texttt{0000000000000001} (solo el bit 64 vale 1) y 8000000000000000\texttt{8000000000000000} (solo el bit 1 vale 1). Da el resultado en hexadecimal.

Ver la solución

En 0000000000000001\texttt{0000000000000001} el único 1 es el bit 64 de la entrada. Buscamos el 64 en la tabla de IPIP: está en la cuarta fila, primera columna, es decir, en la posición 25 de la lista. Así que el bit 64 de la entrada pasa a ser el bit 25 de la salida. Entonces el 1 está en el bit 25, que es el primer bit del cuarto byte (25=3⋅8+125 = 3\cdot 8 + 1): el cuarto byte es 10000000=8010000000 = \texttt{80}. Resultado: 0000008000000000\texttt{0000008000000000}.

Para 8000000000000000\texttt{8000000000000000} el único 1 es el bit 1 de la entrada. En la tabla, el 1 está en la quinta fila, última columna: posición 4⋅8+8=404\cdot 8 + 8 = 40. El 1 pasa al bit 40 de la salida, que es el último bit del byte 5: 00000001=0100000001 = \texttt{01}. Resultado: 0000000001000000\texttt{0000000001000000}.

Ejercicio 2

Con el criptograma c=85E813540F0AB405c = \texttt{85E813540F0AB405} del ejemplo, queremos descifrarlo. ¿Cuánto valen L0L_0 y R0R_0 al empezar el descifrado, sin calcular IPIP a mano? ¿Con qué subclave se hace la primera ronda?

Ver la solución

El último paso de cifrar fue c=IP−1(R16L16)c = IP^{-1}(R_{16}L_{16}). Por tanto IP(c)=R16L16IP(c) = R_{16}L_{16}. Al descifrar, la primera mitad es R16R_{16} y la segunda L16L_{16}, y de la tabla de arriba:

L0′=R16=0A4CD995,R0′=L16=43423234.L_0' = R_{16} = \texttt{0A4CD995}, \qquad R_0' = L_{16} = \texttt{43423234}.

(Lo hemos comprobado calculando IP(c)IP(c) por separado.) La primera ronda de descifrado usa K16K_{16}, la última subclave. Como R16=L15⊕f(R15,K16)R_{16} = L_{15}\oplus f(R_{15},K_{16}) y L16=R15L_{16} = R_{15}, esa ronda calcula R1′=R16⊕f(L16,K16)=L15R_1' = R_{16}\oplus f(L_{16},K_{16}) = L_{15} y deja L1′=L16=R15L_1' = L_{16} = R_{15}: se ha deshecho la ronda 16.

Ejercicio 3

Cambiamos el último bit del mensaje: M′=0123456789ABCDEEM' = \texttt{0123456789ABCDEE}. Calcula IP(M′)IP(M') y la ronda 1 con el mismo K1K_1. ¿Cuántos bits distintos hay entre R1R_1 y R1′R_1'? ¿Qué te dice sobre la difusión?

Ver la solución

El bit 64 de MM pasa a la posición 25 de IPIP (ejercicio 1), que está en L0L_0. El bit 25 es el primer bit del cuarto byte de L0L_0, así que ese byte pasa de FF\texttt{FF} a 7F\texttt{7F}: L0′=CC00CC7FL_0' = \texttt{CC00CC7F}, mientras que R0′=R0=F0AAF0AAR_0' = R_0 = \texttt{F0AAF0AA}. Como R0R_0 no ha cambiado, f(R0′,K1)=f(R0,K1)=234AA9BBf(R_0',K_1) = f(R_0,K_1)=\texttt{234AA9BB}, y

R1′=L0′⊕f=CC00CC7F⊕234AA9BB=EF4A65C4.R_1' = L_0'\oplus f = \texttt{CC00CC7F}\oplus\texttt{234AA9BB} = \texttt{EF4A65C4}.

Frente a R1=EF4A6544R_1 = \texttt{EF4A6544} difiere en un solo bit. Después de la primera ronda, el cambio sigue siendo de un bit, porque ha caído en la mitad que solo se suma con XOR. En la ronda 2 ese bit llegará a ff y empezará a propagarse. Al final, como vimos en la lección 3, el criptograma cambia en 37 de 64 bits: la difusión necesita varias rondas.

En resumen

  • DES es una red de Feistel de 16 rondas sobre bloques de 64 bits, con una clave de 64 bits de los que 56 son efectivos.
  • El esquema es: IPIP, 16 rondas Li=Ri−1L_i = R_{i-1}, Ri=Li−1⊕f(Ri−1,Ki)R_i = L_{i-1}\oplus f(R_{i-1},K_i), intercambio de mitades e IP−1IP^{-1}.
  • IPIP y IP−1IP^{-1} son permutaciones fijas y sin clave: ordenan los bits, no añaden seguridad.
  • Descifrar es cifrar con K16,…,K1K_{16},\dots,K_1, gracias al intercambio final.
  • Falta ver ff (lección 6) y de dónde salen las subclaves (lección 7).

Siguiente lección: La función f de DES y sus cajas S

Para profundizar