The mathematics behind blockchain (parte VII): El cifrado simétrico
Szabo una vez que ha leído el artículo de Satoshi Nakamoto ha descubierto que el corazón que nutre la nueva tecnología que ha creado el Bitcoin es el cifrado. El cifrado o la criptografía simétrica, también denominado dentro del artículo de Nakamoto criptografía de clave secreto consiste en realizar una transformación del texto, letras y números, etc. en otro cifrado para lograr que ese mensaje sea confidencial.
Para esto, se utilizan ciertos principios básicos de la criptografía clásica, analizados anteriormente en este blog, sobre la transposición y sustitución, aplicados a los algoritmos matemáticos conjuntamente a una clave que debe poseer el emisor del mensaje como quien lo tiene que recibir.
La clave que se utiliza para encriptar el mensaje puede ser de un tamaño fijo o un tamaño variable, pero lo importante es dividir el mensaje en diferentes bloques para poderlo cifrar. A este proceso se le denomina cifrado en bloque y se utiliza en los criptosistemas de clave secreta.
Criptosistema DES (Data Encryption Standard)
El criptosistema DES (Data Encryption Standard) surge en los años 70 de un concurso público realizado por la NBS (Nacional Bureau of Standards). El ganador de este concurso fue el algoritmo LUCIFER, pero en 1976 se redujo el tamaño de la clave que se necesitaba y se comenzó a llamar algoritmo DES.
Este criptosistema se ha conseguido descifrar mediante algoritmos de fuerza bruta debido a que la clave no era demasiado larga, pero existe una variante denominada Triple DES. Este criptosistema sigue la estructura EDS (Encryption Decryption Standard), basado en cifrar y descifrar con diferentes claves y de forma repetida.
El criptosistema DES es un sistema de tipo Feistel por bloques, es decir, que de manera original se tiene un bloque con N bits con un mensaje, se divide en dos mitades A y B, y cada una de ella tiene N/2 bits, por tanto, al bloque A se le aplica una función matemática que es unidireccional durante un número determinado de iteraciones, en la cual, se crea la clave. Lo siguiente, se realiza un or-exclusivo (una puerta lógica digital que implementa el o exclusivo, es decir, una salida verdadera (1/HIGH) resulta si una, y solo una de las entradas a la puerta es verdadera) con el bloque anterior y el B, y por último, se intercambian para realizar la siguiente iteración.
Se puede observar en la siguiente imagen como es el esquema de cifrado tipo Feistel:
Este criptosistema utiliza una clave de longitud de 56 bits, aunque no se tienen en cuenta los bits de paridad, utilizados para la detección de posibles errores, si los tenemos en cuenta, la clave de longitud es de 64 bits. El espacio de las claves, es decir, todas las claves que se pueden utilizar son de 2 elevado a 56 posibles claves. Además, se hacen 16 iteraciones aplicando la función para realizar el proceso de cifrado y descifrado.
Es decir, lo podemos hacer siguiente el esquema de iteración del algoritmo de cifrado DES:
Podemos ver en el esquema que tenemos una entrada de 64 bits del texto, además, tenemos la clave K, de 64 bits, a la cual le tenemos que quitar los 8 últimos bits de paridad, ya que estos bits se van a utilizar para realizar la corrección y la detección de posibles errores. También van a intervenir cada una de las subclaves de cada iteración i en la función, denominado Ki. Estas subclaves se obtienen a partir de la clave K.
La primera fase del sistema consiste en realizar una permutación inicial mediante la tabla IP (Initial Permutation) que ya tiene el sistema predefinido. Seguidamente se necesitar calcular las subclaves a partir de la K, para esto, se realiza una permutación y se divide la clave en dos bloques de 28 bits cada uno y entonces se realizar un efecto de desplazamiento hacia la izquierda de cada uno de los bloques, se realiza la permutación de nuevo de los bits y juntamente con los bloques se consigue así la subclave de cada una de las iteraciones.
En cada vuelta, además de obtener la subclave Ki, tenemos que realizar una división del bloque inicial, que ya está permutado, en dos mitades, de 32 bits cada una. Al bloque de la derecha, Ri, se le vuelve aplicar una permutación con expansión para obtener 48 bits y así poder hacer un XOR con la subclave de la iteración i, ya que está tiene una longitud de 48 bits.
Después se introduce el resultado en la Caja-S, de tal manera que pasamos de 48 bits a los 36 bits. Nuevamente, permutamos la salida obtenida de la Caja-S, y realizamos un or-exclusivo con la mitad izquierda inicial, Li, y esto será el nuevo bloque derecho de la siguiente iteración. El bloque izquierdo de la siguiente iteración L i+1 será el bloque derecho inicial de Ri. Después de realizar todo este proceso, se aplica la permutación inversa o final, y obtenemos el mensaje cifrado de 64 bits.
Criptosistema AES (Advanced Encryption Standard)
Al tener una necesidad de conseguir un sistema con mayor seguridad, el NIST (National Institute for Standards and Technology) propuso en 1997 un programa para desarrollar un nuevo sistema de cifrado más potente que el criptosistema DES. El algoritmo que consiguió destacar fue el algoritmo Rijndael, es decir, AES que paso a ser el nuevo estándar de cifrado.
Este criptosistema es un cifrado por bloques, es decir, el mismo sistema que utiliza DES (Data Encryption Standard), pero no utiliza el tipo Feistel, ya que utiliza las longitudes del bloque y las claves variables, por tanto, el proceso que utiliza debe ser múltiplo de 4 bytes y además utiliza los rangos de 128 y 256 bits. Este sistema es seguro debido a nivel de bytes que utiliza y los elementos al cuerpo de Galois (GF), es decir, 2 elevado a 8.
La estructura de AES (Advanced Encryption Standard) se divide en tres capas, es decir, la capa de mezcla lineal, capa de mezcla no lineal y capa de adición de la clave. En el siguiente esquema se pueden observar las iteraciones del algoritmo de cifrado AES:
Como se puede observar en la imagen, cada una de las capas contienen funciones matemáticas. Inicialmente se parte de una matriz que tiene cuatro filas y Nb columnas, siendo Nb el tamaño del bloque entre 32 bits y lo mismo pasa con la clave.
El criptosistema consta de una número determinado de rondas o iteraciones. Las funciones que se utilizan son ShiftRow (intercambia las filas y consigue mayor dispersión), MixColum (mezcla las columnas de la matriz para conseguir dispersión), SubByte (aplica Cajas-S las cuales dependen del tamaño del bloque y no tienen linealidad) y AddRoundKey (aplicar or-exclusivo en cada iteración con la subclave de la ronda y con la matriz de estado intermedio).
El criptosistema para obtener las subclaves utiliza el algoritmo de expansión clave, y este algoritmo se aplican otras funciones como es SubWord, RotByte y Rc.
Continuará…
Referencias:
- Michael Nofer, Peter Gomber, Oliver Hinz y Dirk Schiereck, «Blockchain,» Business & Information Systems Engineering, vol. 59, no 3, pp. 183-187, 2017.
- Tetsuya Izu, Jun Kogure, Masayuki Noro y Kazuhiro Yokoyama, «Efficient Implementation of Schoof’s Algorithm,» International Conference on the Theory and Application of Cryptology and Information Security, vol. 1514, pp. 66-79, 1998.
- Carlos Dolader Retamal, Joan Bel Roig y Jose Luis Muñoz Tapia, «La blockchain: fundamentos , aplicaciones y relación con otras tecnologías disruptivas,» pp. 33-40.