Skip to content
This repository has been archived by the owner on Jun 11, 2019. It is now read-only.

Commit

Permalink
Corete de líneas en algoritmos de cifrados por bloques
Browse files Browse the repository at this point in the history
En commits pasados reduje el ancho de los cuadros de los algoritmos;
algunos de los pseudocódigos de los de bloques se salían de los
margenes, por lo que aquí introduzco los saltos de línea necesarios.

PS: ¡Cuidado! Hay muchos tabulares duros por ahí metidos.
  • Loading branch information
RQF7 committed Jan 22, 2018
1 parent 04d3561 commit 5876b38
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 72 deletions.
41 changes: 21 additions & 20 deletions documentos_entregables/contenidos/antecedentes/bloques/AES.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\subsection{Advanced Encryption Standard (AES)}

Dado que el tamaño de bloque y la longitud de la llave de DES
Dado que el tamaño de bloque y la longitud de la llave de DES
se volvieron muy pequeños para resistir los embates del progreso
de la tecnología, el NIST comenzó la búsqueda de un nuevo cifrado
estándar en 1997; este cifrado debía tener un tamaño de bloque de,
Expand All @@ -13,14 +13,15 @@ \subsection{Advanced Encryption Standard (AES)}
tamaños mencionados anteriormente. Dependiendo del tamaño de la llave, se
tiene el número de rondas: 10 para las de 128 bits, 12 para las de 192 y 14 para las de 256.

El cifrado requiere de una matriz de $4 \times 4$ denominada matriz de
El cifrado requiere de una matriz de $4 \times 4$ denominada matriz de
estado.

\begin{pseudocodigo}[caption={AES, cifrado.}, label={aes:1}]
entrada: 128 bits de texto en claro $M$; llave de $n$ bits $K$.
salida: bloque de texto cifrado de 64 bits $C = c_1 \dots c_{64}$.
entrada: 128 bits de texto en claro $M$; llave de $n$ bits $K$.
salida: bloque de texto cifrado de 64 bits $C = c_1 \dots c_{64}$.
inicio
Obtener las subllaves de 128 bits necesarias: una para cada ronda y una extra.
Obtener las subllaves de 128 bits necesarias: una para
cada ronda y una extra.
Iniciar matriz de estado con el bloque en claro.
Realizar $AddRoundKey(matriz\_estado, k_0)$
Para $i$ desde 1 hasta $num\_rondas$:
Expand All @@ -37,10 +38,10 @@ \subsection{Advanced Encryption Standard (AES)}
fin
\end{pseudocodigo}

Como todos los pasos realizados en las rondas son invertibles, el
proceso de descifrado consiste en aplicar las funciones inversas a
$SubBytes$, $ShiftRows$, $MixColumns$ y $AddRoundKey$ en el orden
opuesto.
Como todos los pasos realizados en las rondas son invertibles, el
proceso de descifrado consiste en aplicar las funciones inversas a
$SubBytes$, $ShiftRows$, $MixColumns$ y $AddRoundKey$ en el orden
opuesto.

\subsubsection{SubBytes}
Esta es la única transformación no lineal de Rijndael. Sustituye
Expand All @@ -55,10 +56,10 @@ \subsubsection{ShiftRows}
fila y dependen de la longitud del bloque ($N_b$).

\subsubsection{MixColumns}
Esta transformación opera en cada columna de la matriz de estado
independientemente. Se considera una columna $a = (a_0, a_1, a_2, a_3)$
como el polinomio $a(X) = a_3X^3 + a_2X^2 + a_1X + a_0$.
Entonces este paso transforma una columna $a$ al multiplicarla con el
Esta transformación opera en cada columna de la matriz de estado
independientemente. Se considera una columna $a = (a_0, a_1, a_2, a_3)$
como el polinomio $a(X) = a_3X^3 + a_2X^2 + a_1X + a_0$.
Entonces este paso transforma una columna $a$ al multiplicarla con el
siguiente polinomio fijo:
\begin{equation}
\label{cifrado_aes_poli}
Expand All @@ -72,10 +73,10 @@ \subsubsection{MixColumns}

\subsubsection{AddRoundKey}
Esta es la única operación que depende de la llave secreta $k$. Añade una
llave de ronda para intervenir en el resultado de la matriz de estado.
Las llaves de ronda son derivadas de la llave secreta $k$ al aplicar el
llave de ronda para intervenir en el resultado de la matriz de estado.
Las llaves de ronda son derivadas de la llave secreta $k$ al aplicar el
algoritmo de generación de llaves. Las llaves de ronda tienen la misma
longitud que los bloques. Esta operación es simplemente una operación
longitud que los bloques. Esta operación es simplemente una operación
$XOR$ bit a bit de la matriz de estado con la llave de ronda en turno.
Para obtener el nuevo valor de la matriz de estado se realiza lo
siguiente:
Expand All @@ -86,10 +87,10 @@ \subsubsection{AddRoundKey}

Como se tiene una matriz\_estado, la llave de ronda ($k_i$) también
es representada como una matriz de bytes con 4 columnas y $N_b$ columnas.
Cada una de las $N_b$ palabras de la llave de ronda corresponde a una
columna. Entonces se realiza la operación $XOR$ bit a bit sobre las
entradas correspondientes de la matriz de estado y la matriz de la llave
Cada una de las $N_b$ palabras de la llave de ronda corresponde a una
columna. Entonces se realiza la operación $XOR$ bit a bit sobre las
entradas correspondientes de la matriz de estado y la matriz de la llave
de ronda.

Esta operación, claro está, es invertible: basta con aplicar la misma
operación con la misma llave para revertir el efecto.
operación con la misma llave para revertir el efecto.
48 changes: 26 additions & 22 deletions documentos_entregables/contenidos/antecedentes/bloques/DES.tex
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
\subsection{Data Encryption Standard (DES)}

Este es, probablemente, el cifrado simétrico por bloques más conocido;
ya que en la década de los 70 estableció un precedente al ser el primer
algoritmo a nivel comercial que publicó abiertamente sus
Este es, probablemente, el cifrado simétrico por bloques más conocido;
ya que en la década de los 70 estableció un precedente al ser el primer
algoritmo a nivel comercial que publicó abiertamente sus
especificaciones y detalles de implementación. Se encuentra definido
en el estándar americano FIPS 46-2.

DES es un cifrado Feistel que procesa bloques de $n=64$ bits y produce
bloques cifrados de la misma longitud. Aunque la llave es de 64 bits, 8
son de paridad, por lo que el tamaño \textit{efectivo} de la llave es de
56 bits. Las $2^{56}$ llaves implementan, máximo, $2^{56}$ de las
56 bits. Las $2^{56}$ llaves implementan, máximo, $2^{56}$ de las
$2^{64}!$ posibles biyecciones en bloques de 64 bits.

Con la llave $K$ se generan 16 subllaves $K_i$ de 48 bits; una para cada
ronda. En cada ronda se utilizan 8 \textit{cajas-s} (mapeos de
Con la llave $K$ se generan 16 subllaves $K_i$ de 48 bits; una para cada
ronda. En cada ronda se utilizan 8 \textit{cajas-s} (mapeos de
sustitución de 6 a 4 bits). La entrada de 64 bits es dividida por la mitad
en $L_0$ y $R_0$. Cada ronda $i$ va tomando las entradas $L_{i-1}$ y
en $L_0$ y $R_0$. Cada ronda $i$ va tomando las entradas $L_{i-1}$ y
$R_{i-1}$ de la ronda anterior y produce salidas de 32 bits $L_i$ y $R_i$
mientras $1 \leq i \leq 16$ de la siguiente manera:

Expand All @@ -29,45 +29,49 @@ \subsection{Data Encryption Standard (DES)}
R_i = L_{i-1} \oplus f(R_{i-1}, K_i); f(R_{i-1}, K_i) = P(S(E(R_{i-1})\oplus K_i))
\end{equation}

$E$ se encarga de expandir $R_{i-1}$ de 32 bits a 48, $P$ es una
permutación de 32 bits y $S$ son las cajas-s.
$E$ se encarga de expandir $R_{i-1}$ de 32 bits a 48, $P$ es una
permutación de 32 bits y $S$ son las cajas-s.

\begin{pseudocodigo}[caption={DES, cifrado.}, label={des:1}]
entrada: 64 bits de texto en claro $M = m_1 \dots m_64$; llave de 64 bits $K = k_1 \dots k_{64}$.
salida: bloque de texto cifrado de 64 bits $C = c_1 \dots c_{64}$.
entrada: 64 bits de texto en claro $M = m_1 \dots m_64$;
llave de 64 bits $K = k_1 \dots k_{64}$.
salida: bloque de texto cifrado de 64 bits $C = c_1 \dots c_{64}$.
inicio
Calcular 16 subllaves $K_i$ de 48 bits partiendo de $K$.
$(L_0, R_0) \leftarrow IP(m_1m_2\dots m_{64}$
Para $i$ desde 1 hasta 16: Calcular $L_i$ y $R_i$ mediante las ecuaciones mostradas anteriormente.
Para $i$ desde 1 hasta 16: Calcular $L_i$ y $R_i$ mediante las ecuaciones
mostradas anteriormente.
Obtener $f(R_{i-1}, K_i)$ así:
a) Expandir $R_{i-1} = r_1r_2\dots r_{32}$ de 32 a 48 bits usando $E$: $T \leftarrow E(R_{i-1})$.
b) $T^\prime \leftarrow T \oplus K_i$. Donde $T^\prime$ es representado como ocho cadenas de 6 bits cada una $(B_1, \dots, B_8)$.
c) $T'' \leftarrow (S_1(B_1), S_2(B_2), \dots S_8(B_8))$
d) $T''' \leftarrow P(T'')$
a) Expandir $R_{i-1} = r_1r_2\dots r_{32}$ de 32 a 48 bits
usando $E$: $T \leftarrow E(R_{i-1})$.
b) $T^\prime \leftarrow T \oplus K_i$. Donde $T^\prime$ es representado
como ocho cadenas de 6 bits cada una $(B_1, \dots, B_8)$.
c) $T'' \leftarrow (S_1(B_1), S_2(B_2), \dots S_8(B_8))$
d) $T''' \leftarrow P(T'')$
fin
$b_1b_2 \dots b_{64} \leftarrow (R_{16}, L{16})$.
$C \leftarrow IP^{-1}(b_1b_2 \dots b_{64})$
fin
\end{pseudocodigo}

El descifrado DES consiste en el mismo algoritmo de cifrado, con la
El descifrado DES consiste en el mismo algoritmo de cifrado, con la
misma llave $K$, pero utilizando las subllaves en orden inverso:
$K_{16}, K{15}, \dots, K_1$.

\subsubsection{Llaves débiles}
Tomando en cuenta las siguientes definiciones

\begin{itemize}
\item Llave débil: una llave $K$ tal que $E_K(E_K(x)) = x$ para toda
\item Llave débil: una llave $K$ tal que $E_K(E_K(x)) = x$ para toda
$x$.
\item Llaves semidébiles: se tiene un par de llaves $K_1, K_2$ tal que
$E_{K_1}(E_{K_2}(x)) = x$
\end{itemize}

DES tiene cuatro llaves débiles y seis pares de llaves semidébiles.
Las cuatro llaves débiles generan subllaves $K_i$ iguales y, debido a
que DES es un cifrado Feistel, el cifrado es autorreversible. O sea que
Las cuatro llaves débiles generan subllaves $K_i$ iguales y, debido a
que DES es un cifrado Feistel, el cifrado es autorreversible. O sea que
al final se obtiene de nuevo el texto en claro, pues cifrar dos veces
con la misma llave regresa la entrada original.
Respecto a los pares semidébiles, el cifrado con una de las llaves del
par es equivalente al descifrado con la otra (o viceversa).
Respecto a los pares semidébiles, el cifrado con una de las llaves del
par es equivalente al descifrado con la otra (o viceversa).
31 changes: 17 additions & 14 deletions documentos_entregables/contenidos/antecedentes/bloques/FEAL.tex
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
\subsection{Fast Data Encipherment Algorithm (FEAL)}

Es una familia de algoritmos que ha tenido una participación crítica
en el desarrollo y refinamiento de varias técnicas del criptoanálisis,
en el desarrollo y refinamiento de varias técnicas del criptoanálisis,
tales como el criptoanálisis lineal y diferencial. FEAL-N mapea
bloques de texto en claro de 64 bits a bloques de 64 bits de texto
cifrado mediante una llave secreta de 64 bits. Es un cifrado Feistel de
cifrado mediante una llave secreta de 64 bits. Es un cifrado Feistel de
$n-$rondas parecido a DES, pero con una función $f$ más simple.

FEAL fue diseñado para ser veloz y simple, especialmente para
FEAL fue diseñado para ser veloz y simple, especialmente para
microprocesadores de 8 bits: usa operaciones orientadas a bytes, evita
el uso de permutaciones de bit y tablas de consulta. La versión inicial
de cuatro rondas (FEAL-4), propuesto como una alternativa rápida a DES,
de cuatro rondas (FEAL-4), propuesto como una alternativa rápida a DES,
fue encontrado mucho más inseguro de lo planeado; por lo que se propuso
realizar más rondas (FEAL-16 y FEAL-32) para compensar y ofrecer un nivel
de seguridad parecido a DES; sin embargo, el rendimiento se ve fuertemente
afectado mientras el número de rondas aumenta; y, mientras DES puede
mejorar su velocidad con tablas de consulta, resulta más complicado
afectado mientras el número de rondas aumenta; y, mientras DES puede
mejorar su velocidad con tablas de consulta, resulta más complicado
para FEAL.

\begin{pseudocodigo}[caption={FEAL-8, cifrado.}, label={feal8:1}]
entrada: 64 bits de texto en claro $M = m_1 \dots m_64$; llave de 64 bits $K = k_1 \dots k_64$.
salida: bloque de texto cifrado de 64 bits $C = c_1 \dots c_64$.
entrada: 64 bits de texto en claro $M = m_1 \dots m_64$;
llave de 64 bits $K = k_1 \dots k_64$.
salida: bloque de texto cifrado de 64 bits $C = c_1 \dots c_64$.
inicio
Calcular 16 subllaves de 16 bits para $K$.
Definir $M_L = m_1 \dots m_32; M_R = m_33 \dots m_64$.
Expand All @@ -36,12 +37,14 @@ \subsection{Fast Data Encipherment Algorithm (FEAL)}
fin
\end{pseudocodigo}

% ¿Qué demonios? Las tuplas de llaves se salen del margen.

Para descifrar se utiliza el mismo algoritmo, con la misma llave $K$ y el
texto cifrado $C = (R_8, L_8)$ se utiliza como la entrada $M$; sin
embargo, la generación de llaves se hace al revés: las subllaves
$((K_12, K_13), (K_14, K_15))$ se utilizan para la $\oplus$ inicial, las
$((K_8, K_9), (K_10, K_11))$ para la $\oplus$ final y en las rondas se
texto cifrado $C = (R_8, L_8)$ se utiliza como la entrada $M$; sin
embargo, la generación de llaves se hace al revés: las subllaves
$((K_12, K_13), (K_14, K_15))$ se utilizan para la $\oplus$ inicial, las
$((K_8, K_9), (K_10, K_11))$ para la $\oplus$ final y en las rondas se
utiliza de la subllave $K_7$ a la $K_0$.

FEAL con una llave de 64 bits puede ser generalizado a $N-$ rondas con
$N$ par, aunque se recomienda $N = 2^x$.
FEAL con una llave de 64 bits puede ser generalizado a $N-$ rondas con
$N$ par, aunque se recomienda $N = 2^x$.
34 changes: 18 additions & 16 deletions documentos_entregables/contenidos/antecedentes/bloques/IDEA.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,27 @@ \subsection{International Data Encryption Algorithm (IDEA)}

Cifra bloques de 64 bits utilizando una llave de 128 bits. Este cifrado
está basado en una generalización de la estructura Feistel y consiste en
8 rondas idénticas seguidas por una transformación. Cada ronda $r$
utiliza 6 subllaves $K^{(r)}_i$ ($1 \leq i \leq 6$) de 16 bits que se
encargan de transformar una entrada $X$ de 64 bits en una salida de
cuatro bloques de 16-bits, que son utilizados como entrada en la
siguiente ronda. La salida de la ronda 8 tiene como entrada la
transformación de salida que, al emplear cuatro llaves adicionales
$K^{(9)}_i$ ($1 \leq i \leq 4$), produce los datos cifrados
8 rondas idénticas seguidas por una transformación. Cada ronda $r$
utiliza 6 subllaves $K^{(r)}_i$ ($1 \leq i \leq 6$) de 16 bits que se
encargan de transformar una entrada $X$ de 64 bits en una salida de
cuatro bloques de 16-bits, que son utilizados como entrada en la
siguiente ronda. La salida de la ronda 8 tiene como entrada la
transformación de salida que, al emplear cuatro llaves adicionales
$K^{(9)}_i$ ($1 \leq i \leq 4$), produce los datos cifrados
$Y = (Y_1, Y_2, Y_3, Y_4)$.

% Lo siento, pero si corto la línea de la entrada, la entrada queda a
% Lo siento, pero si corto la línea de la entrada, la entrada queda a
% la mitad y se ve muy raro.

\begin{pseudocodigo}[caption={IDEA, cifrado.}, label={idea:1}]
entrada: $64-$bits de datos en claro $M = m_1 \dots m_64$; llave de $128-$bits $ K = k_1 \dots k_{128}$.
salida: bloque cifrado de $64-$bits $Y = (Y_1, Y_2, Y_3, Y_4)$.
entrada: $64-$bits de datos en claro $M = m_1 \dots m_64$;
llave de $128-$bits $ K = k_1 \dots k_{128}$.
salida: bloque cifrado de $64-$bits $Y = (Y_1, Y_2, Y_3, Y_4)$.
inicio
Calcular las subllaves $K^{(r)}_1, \dots, K^{(r)}_{6}$ para las rondas $1 \leq r \leq 8$ y $K^{(9)}_1, \dots, K^{(9)}_{4}$
para la transformación de salida.
$(X_1, X_2, X_3, X_4) \leftarrow (m_1 \dots m_{16}, m_{17} \dots m_{32}, m_{33} \dots m_{48}, m_{49} \dots m_{64})$ donde $X_i$ almacena 16 bits.
$(X_1, X_2, X_3, X_4) \leftarrow (m_1 \dots m_{16}, m_{17} \dots m_{32}, m_{33} \dots m_{48}, m_{49} \dots m_{64})$
donde $X_i$ almacena 16 bits.
Para la ronda $r$ desde 1 hasta 8:
a) $X_1 \leftarrow X_1 \times K_1^{(r)} mod 2^{16} + 1$
$X_4 \leftarrow X_4 \times K_4^{(r)} mod 2^{16} + 1$
Expand All @@ -43,13 +45,13 @@ \subsection{International Data Encryption Algorithm (IDEA)}
fin
\end{pseudocodigo}

El descifrado se realiza con el mismo algoritmo de cifrado, pero
El descifrado se realiza con el mismo algoritmo de cifrado, pero
utilizando como entrada los datos cifrados $Y$ como entrada $M$. Se usa la
misma llave $K$; aunque las subllaves sufren una modificación al ser
generadas, pues se utiliza una tabla y se realizan las operaciones
generadas, pues se utiliza una tabla y se realizan las operaciones
contrarias (inverso de la adición y el inverso del producto).

Descartando los ataques a las llaves débiles, no hay un mejor ataque
Descartando los ataques a las llaves débiles, no hay un mejor ataque
publicado para el IDEA de 8 rondas que el de la búsqueda exhaustiva
en el espacio de llave. Por lo que la seguridad está ligada a la
creciente debilidad de su tamaño de bloque relativamente pequeño.
en el espacio de llave. Por lo que la seguridad está ligada a la
creciente debilidad de su tamaño de bloque relativamente pequeño.
Binary file modified documentos_entregables/documento_final.pdf
Binary file not shown.

1 comment on commit 5876b38

@RQF7
Copy link
Owner Author

@RQF7 RQF7 commented on 5876b38 Mar 8, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#6

Please sign in to comment.