Cifrado de Feistel
# Cifrado de Feistel

En criptografía, el Cifrado de Feistel es un método de cifrado en bloque con una estructura particular. Debe su nombre al criptógrafo de IBM Horst Feistel. También es conocida comúnmente como Red de Feistel o Cadena de Feistel. Un gran número de algoritmos de cifrado por bloques lo utilizan, siendo el más conocido el algoritmo Data Encryption Standard (DES). Las redes de Feistel presentan la ventaja de ser reversibles por lo que las operaciones de cifrado y descifrado son idénticas, requiriendo únicamente invertir el orden de las subclaves utilizadas.

## Historia

El primer algoritmo basado en las redes de Feistel fue el algoritmo Lucifer, diseñado al amparo de IBM por Horst Feistel y Don Coppersmith a principios de la década del 1970, aunque la popularidad para este esquema llegó cuando el Gobierno Federal de los Estados Unidos adoptó el algoritmo DES como estándar para el cifrado de las comunicaciones gubernamentales. Este algoritmo derivaba del algoritmo Lucifer y también está constituido por una red de Feistel. La naturaleza iterativa de estas redes hacía que la implementación del algoritmo en hardware fuera sencillo.

## El algoritmo

Este algoritmo se denomina simétrico por rondas, es decir, realiza siempre las mismas operaciones un número determinado de veces (denominadas rondas). Los pasos de la red de Feistel son entre algunos más:

* Se selecciona una cadena, N, normalmente de 64 o 128 bits, y se la divide en dos subcadenas, L y R, de igual longitud (N/2)
* Se toma una función, F, y una clave $K_i$
* Se realizan una serie de operaciones complejas con F y $K_i$ y con L o R (solo uno de ellas)
* La cadena obtenida se cambia por la cadena con la que no se han realizado operaciones, y se siguen haciendo las rondas.

## Detalles de Construcción

Las operaciones básicas de una red de Feistel son las siguientes: se descompone el texto plano en dos piezas iguales, ($L_{0}$, $R_{0}$). Para realizar el cifrado en cada ronda $i=1,2,\dots ,n$, se calcula

    $L_{i}=R_{i-1}$
    $R_{i}=L_{i-1}\oplus f(R_{i-1},K_{i})$

donde $f$ es una función y $K_{i}$ son cada una de las subclaves aplicadas a cada iteración. El texto cifrado viene dado por la concatenación de $L_{n}$ y $R_{n}$.

Para el descifrado las operaciones que hay que realizar son:

    $R_{i-1}=L_{i}$
    $L_{i-1}=R_{i}\oplus f(L_{i},K_{i})$

Una ventaja de este modelo es que la función $f$ usada no tiene por qué ser reversible, pudiendo ser todo lo complicada que se desee, esta cualidad permite a los criptógrafos concentrarse en la seguridad de dicha función sabiendo que el proceso de descifrado está garantizado ya que la propia estructura de la red de Feistel es reversible. Para ello únicamente requiere que se invierta el orden de las subclaves utilizadas.

Una variación del esquema de Feistel son las redes de Feistel no balanceadas en las que las mitades del texto en plano L0 y R0 son de diferente longitud. Un algoritmo de cifrado que utiliza esta variación es el algoritmo Skipjack.

