AES, Rijndael-AES, Rijndael | |
---|---|
Creador |
Vicente Rayman Yoan Dymen |
Creado | 1998 _ |
Tamaño de clave | 128/192/256 bits |
Tamaño de bloque | 128 bits |
Número de rondas | 12/10/14 (depende del tamaño de la clave) |
Tipo de | Red de sustitución-permutación |
Archivos multimedia en Wikimedia Commons |
AES ( Advanced Encryption Standard ; también Rijndael , [rɛindaːl] - reindal ) es un algoritmo de cifrado de bloque simétrico (tamaño de bloque 128 bits, clave 128/192/256 bits), adoptado como estándar de cifrado por el gobierno de EE. concurso AES . Este algoritmo ha sido bien analizado y ahora se usa ampliamente, como fue el caso de su predecesor DES . El Instituto Nacional de Estándares y Tecnología de EE . UU. (NIST) publicó la especificación AES el 26 de noviembre de 2001 después de un período de cinco años durante el cual se crearon y evaluaron 15 nominaciones. El 26 de mayo de 2002, se anunció AES como el estándar de cifrado. A partir de 2009, AES es uno de los algoritmos de cifrado simétrico más utilizados [1] [2] . Intel introdujo la compatibilidad con la aceleración AES en la familia de procesadores x86 a partir de Arrandale en 2010 y más tarde en los procesadores Sandy Bridge ; AMD ha estado con Bulldozer desde 2011.
El 2 de enero de 1997, NIST anuncia [3] su intención de seleccionar un sucesor de DES , que ha sido el estándar estadounidense desde 1977 . El 2 de octubre de 2000 se anunció que el ganador del concurso era el algoritmo de Rijndael [4] y se inició el procedimiento de estandarización. El 28 de febrero de 2001, se publicó el borrador y el 26 de noviembre de 2001, AES fue aceptado como FIPS 197. Se puede encontrar una retrospectiva histórica de la competencia en el sitio web del NIST [5] .
bloquear | la secuencia de bits que componen la entrada, la salida, el estado y la clave redonda. El bloque también puede entenderse como una secuencia de bytes. |
---|---|
clave de cifrado | una clave criptográfica secreta que utiliza el procedimiento de expansión de claves para producir un conjunto de claves redondas; se puede representar como una matriz de bytes rectangular que tiene cuatro filas y Nk columnas |
Texto cifrado | salida del algoritmo de cifrado |
expansión clave | procedimiento para generar Round Keys a partir de Cipher Key |
llave redonda | Las claves redondas se obtienen de la clave de cifrado mediante el procedimiento de expansión de clave. Se aplican al Estado al cifrar y descifrar |
Estado | resultado de cifrado intermedio, que se puede representar como una matriz de bytes rectangular que tiene 4 filas y Nb columnas |
caja S | tabla de sustitución no lineal utilizada en varias transformaciones de sustitución de bytes y en el procedimiento de expansión de clave para la sustitución uno a uno de un valor de byte. El S-box precalculado se puede ver a continuación |
Nótese bien | el número de columnas (palabras de 32 bits) que componen el Estado . Para AES Nb = 4 |
Nk | el número de palabras de 32 bits que componen la clave de cifrado. Para AES Nk = 4, 6 u 8 |
No. | el número de rondas, que es una función de Nk y Nb . Para AES Nr = 10, 12, 14 |
Rcon[] | una matriz que consta de los bits de una palabra de 32 bits y es constante para una ronda determinada. El Rcon[] precalculado se puede ver a continuación |
caja S
caja = matriz{ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };Caja S inversa para el procedimiento InvSubBytes
InvSbox = matriz{ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };Rcon[]
Rcon = matriz{ matriz{0x00, 0x00, 0x00, 0x00}, matriz{0x01, 0x00, 0x00, 0x00}, matriz{0x02, 0x00, 0x00, 0x00}, matriz{0x04, 0x00, 0x00, 0x00}, matriz{0x08, 0x00, 0x00, 0x00}, matriz{0x10, 0x00, 0x00, 0x00}, matriz{0x20, 0x00, 0x00, 0x00}, matriz{0x40, 0x00, 0x00, 0x00}, matriz{0x80, 0x00, 0x00, 0x00}, matriz{0x1b, 0x00, 0x00, 0x00}, matriz{0x36, 0x00, 0x00, 0x00} };AñadirClaveRonda() | transformación durante el cifrado y el cifrado inverso, en el que Round Key XOR es c State. La longitud de RoundKey es igual al tamaño del Estado (es decir, si Nb = 4, entonces la longitud de RoundKey es de 128 bits o 16 bytes) |
---|---|
InvMixColumns() | transformación en el descifrado, que es lo contrario de MixColumns() |
InvShiftRows() | transformación en el descifrado, que es lo contrario de ShiftRows() |
InvSubBytes() | transformación en el descifrado, que es el inverso de SubBytes() |
MezclarColumnas() | transformación de cifrado que toma todas las columnas de estado y mezcla sus datos (independientemente unos de otros) para obtener nuevas columnas |
RotPalabra() | una función utilizada en el procedimiento de expansión de clave que toma una palabra de 4 bytes y la recorre |
ShiftRows() | transformaciones de encriptación que procesan el Estado, cambiando cíclicamente las últimas tres líneas del Estado por diferentes valores |
subbytes() | transformaciones de cifrado que procesan el Estado utilizando una tabla de sustitución de bytes no lineal (S-box), aplicándola de forma independiente a cada byte del Estado |
subpalabra() | función utilizada en el procedimiento Key Expansion que toma una palabra de cuatro bytes como entrada y, aplicando un S-box a cada uno de los cuatro bytes, produce una palabra de salida |
AES es un estándar basado en el algoritmo Rijndael. Para AES, la longitud de entrada (bloque de datos de entrada) y State (estado) es constante e igual a 128 bits, y la longitud de la clave de cifrado K es 128, 192 o 256 bits. Al mismo tiempo, el algoritmo Rijndael original permite una longitud de clave y un tamaño de bloque de 128 a 256 bits con un paso de 32 bits. Para indicar las longitudes seleccionadas de entrada, estado y clave de cifrado en palabras de 32 bits, se utiliza la notación Nb = 4 para entrada y estado, Nk = 4, 6, 8 para clave de cifrado, respectivamente, para diferentes longitudes de clave.
Al comienzo del cifrado, la entrada se copia en la matriz State con la regla , for y . Después de eso, el procedimiento AddRoundKey() se aplica al Estado, y luego el Estado pasa por el procedimiento de transformación (ronda) 10, 12 o 14 veces (dependiendo de la longitud de la clave), teniendo en cuenta que la última ronda es ligeramente diferente a los anteriores. Como resultado, después de completar la última ronda de transformación, State se copia en la salida de acuerdo con la regla , for y .
Las transformaciones separadas SubBytes(), ShiftRows(), MixColumns() y AddRoundKey() manejan el estado. Array w[] - contiene el programa clave.
Cifrado(byte de entrada[4*Nb], byte de salida[4*Nb], palabra w[Nb*(Nr+1)]) empezar estado del byte[4,Nb] estado = en AddRoundKey(estado, w[0, Nb-1]) para ronda = 1 paso 1 a Nr-1 SubBytes (estado) ShiftRows(estado) MixColumns(estado) AddRoundKey(estado, w[redondo*Nb, (redondo+1)*Nb-1]) fin para SubBytes (estado) ShiftRows(estado) AddRoundKey(estado, w[Nr*Nb, (Nr+1)*Nb-1]) fuera = estado finalFigura 1. Pseudocódigo para cifrado
Subbytes()El procedimiento SubBytes() procesa cada byte de estado de forma independiente realizando una sustitución de bytes no lineal utilizando una tabla de sustitución (S-box). Esta operación asegura la no linealidad del algoritmo de cifrado. La construcción de un S-box consta de dos pasos. Primero se toma el recíproco del campo de Galois . Para todas las operaciones en este campo, se usa un polinomio irreducible . En segundo lugar, para cada byte b que conforma el S-box, se aplica la siguiente operación:
donde , y donde es el i-ésimo bit de b, y es el i-ésimo bit de la constante . Esto proporciona protección contra ataques basados en propiedades algebraicas simples.
ShiftRows()ShiftRowsfunciona con cadenas de estado. Con esta transformación, las líneas de estado se desplazan cíclicamente horizontalmente por r bytes dependiendo del número de línea. Para la fila cero, r = 0, para la primera fila, r = 1 B, etc.. Así, cada columna del estado de salida después de aplicar el procedimiento ShiftRowsconsta de bytes de cada columna del estado inicial. Para el algoritmo de Rijndael, el patrón de desplazamiento de cadena para cadenas de 128 y 192 bits es el mismo. Sin embargo, para un bloque de 256 bits, se diferencia de los anteriores en que las filas 2, 3 y 4 se desplazan en 1, 3 y 4 bytes, respectivamente. Esta nota no se aplica a AES, ya que solo usa el algoritmo Rijndael con bloques de 128 bits, independientemente del tamaño de la clave.
MezclarColumnas()El procedimiento MixColumnsmezcla los cuatro bytes de cada columna de estado utilizando una transformación lineal reversible. MixColumnsprocesa estados por columnas, tratando cada una de ellas como un polinomio de tercer grado. Estos polinomios se multiplican [6] en módulo por un polinomio fijo . Junto con introduce la difusión en el cifrado. ShiftRows MixColumns
AddRoundKey()AddRoundKey RoundKeyCombina con Estado en cada procedimiento de ronda . Para cada ronda Roundkey se obtiene de CipherKeyc usando el procedimiento KeyExpansion; cada RoundKey tiene el mismo tamaño que el Estado. El procedimiento realiza un XOR bit a bit de cada byte Statecon cada byte RoundKey.
El algoritmo de procesamiento de claves consta de dos procedimientos:
El algoritmo AES, usando el procedimiento KeyExpansion() y alimentándolo con Cipher Key, K, obtiene las claves para todas las rondas. Hay Nb*(Nr + 1) palabras en total: inicialmente, el algoritmo necesita un conjunto de Nb palabras, y cada una de las Nr rondas necesita Nb conjuntos de datos clave. La matriz resultante de claves para rondas se denota como , . El algoritmo KeyExpansion() se muestra en el pseudocódigo a continuación.
La función SubWord() toma una palabra de entrada de cuatro bytes y aplica un S-box a cada uno de los cuatro bytes. Lo que sucedió se alimenta a la salida. RotWord() toma una palabra como entrada , la recorre y la devuelve . La matriz de palabras que es constante para esta ronda, contiene los valores de , donde x = {02}, y es una potencia de ( comienza desde 1).
En la figura, puede ver que las primeras palabras de la clave extendida se completan con Cipher Key. En cada palabra posterior, se pone , el valor obtenido durante la operación XOR y , aquellos XOR de las anteriores y Nk posiciones antes de las palabras. Para palabras cuya posición es un múltiplo de Nk, se aplica una transformación a w[i-1] antes del XOR, seguido de un XOR con la constante de ronda Rcon[i]. La transformación anterior consiste en un desplazamiento circular de los bytes en una palabra (RotWord()) seguido de un procedimiento SubWord(), igual que SubBytes(), solo que los datos de entrada y salida tendrán el tamaño de una palabra.
Es importante tener en cuenta que el procedimiento KeyExpansion() para una clave de cifrado de 256 bits es ligeramente diferente al de las claves de cifrado de 128 y 192 bits. Si y es un múltiplo de , entonces SubPalabra() se aplica antes de XOR'a.
KeyExpansion(clave byte[4 * Nk], palabra w[Nb * (Nr+1)], Nk) empezar palabra temporal yo = 0; mientras (i < Nk) w[i] = palabra(clave[4*i], clave[4*i+1], clave[4*i+2], clave[4*i+3]) yo = yo + 1 terminar mientras yo = nk while(i < Nb * (Nr+1)) temperatura = w[i - 1] si (i mod Nk = 0) temp = SubPalabra(RotPalabra(temp)) xor Rcon[i / Nk] si no (Nk > 6 y yo mod Nk = 4) temp = SubPalabra(temp) terminara si w[i] = w[i - Nk] xor temp yo = yo + 1 terminar mientras finalPseudocódigo para expansión clave
Pseudocódigo para cifrado inverso
En cada iteración , la clave de ronda para la operación AddRoundKey se selecciona de la matriz , comenzando desde el elemento hasta .
Basado en el algoritmo Rijndael subyacente a AES, se implementan criptoalgoritmos alternativos. Entre los más famosos se encuentran los participantes del concurso Nessie : Anubis sobre involuciones, escrito por Vincent Rayman y una versión mejorada del cifrado - Grand Cru de Johan Borst.
En junio de 2003, la Agencia de Seguridad Nacional de EE. UU. determinó que AES era lo suficientemente potente como para proteger información clasificada . Hasta el nivel SECRET se permitía utilizar claves de 128 bits, para el nivel TOP SECRET se requerían claves de 192 y 256 bits [7] .
A diferencia de la mayoría de los otros cifrados, AES tiene una descripción matemática simple. Esto preocupó a Niels Ferguson , entre otros, quien señaló en su trabajo que la seguridad de un cifrado se basa en una nueva suposición no probada sobre la complejidad de resolver ciertos tipos de ecuaciones ( inglés “La seguridad de Rijndael depende de una nueva suposición de dureza no probada : es computacionalmente inviable resolver ecuaciones de este tipo" ) [8] [9] , así como Bruce Schneier, quien escribió en un libro conjunto con Nils:
Tenemos una crítica a AES: realmente no confiamos en su seguridad. Lo que más nos preocupa de AES es su estructura algebraica simple... Ningún otro cifrado de bloques tiene una representación algebraica tan simple. No tenemos idea de si esto conduce a un ataque o no, pero no saber esto es motivo suficiente para ser escéptico sobre el uso de AES.
Texto original (inglés)[ mostrarocultar] Tenemos una crítica a AES: no confiamos mucho en la seguridad... Lo que más nos preocupa de AES es su estructura algebraica simple... Ningún otro cifrado de bloque que conozcamos tiene una representación algebraica tan simple. No tenemos idea de si esto conduce a un ataque o no, pero no saberlo es razón suficiente para ser escépticos sobre el uso de AES. - Niels Ferguson , Bruce Schneier Criptografía práctica - 2003 - pp. 56-57Nicolas Courtois y Josef Pieprzyk publicaronun artículo en 2002 en el que describían un ataque teórico al que llamaron ataque XSL ( extended Sparse Linearization ), que podría permitir romper cifrados AES y Serpent [10] [11] . Sin embargo, los resultados del trabajo no fueron aceptados por todos con optimismo:
Creo que hay un error en el trabajo de Courtois-Pepshik. Sobreestimaron el número de ecuaciones linealmente independientes. Como resultado, no tienen suficientes ecuaciones lineales para resolver el sistema y el método [especificado] no puede descifrar Rijndael. Tiene algo de mérito y vale la pena explorarlo, pero no piratea a Rijndael en su forma actual.
Texto original (inglés)[ mostrarocultar] Creo que el trabajo de Courtois-Pieprzyk tiene fallas. Sobrecuentan el número de ecuaciones linealmente independientes. El resultado es que, de hecho, no tienen suficientes ecuaciones lineales para resolver el sistema, y el método no rompe Rijndael... El método tiene algo de mérito y vale la pena investigarlo, pero no rompe Rijndael tal como está. — Don Coppersmith , comentario en la publicación de blog de Bruce SchneierEn la página dedicada a la discusión del concurso NESSIE , a finales de 2002, uno de los autores del cifrado, Vincent Rayman, afirmó que el ataque XSL es solo un sueño ( inglés The XSL attack is not an attack. It is a dream ) (este punto de vista se repitió más tarde en 2004 en la 4ª conferencia AES en Bonn ). A esto, Courtois respondió que ese sueño podría convertirse en una pesadilla para el autor de AES (en inglés también puede ser un sueño muy malo y convertirse en una pesadilla ) [12] (juego de palabras: el sueño se traduce tanto como un sueño como como un sueño Nightmare se traduce como pesadilla, pesadilla ) .
En 2003, Sean Murphy y Matt Robshaw publicaron un artículo en el que ( asumiendo que los resultados de Courtois y Pepshik son correctos) justificaban la posibilidad de atacar el algoritmo AES, reduciendo el número de operaciones de crackeo de 2128 a 2100 . Sin embargo, en la 4ª conferencia AES , Ilia Toli y Alberto Zanoni demostraron que el trabajo de Murphy y Robshaw era incorrecto [ 13] . Más tarde, en 2007, Chu-Wee Lim y Khoongming Khoo también demostraron que este ataque no puede funcionar como se describe [14 ] .
Los ataques de canal lateral no están relacionados con las características matemáticas del cifrado, sino que utilizan ciertas características de implementación de los sistemas que utilizan estos cifrados para revelar datos parcial o totalmente secretos, incluida la clave. Hay varios ataques similares a los sistemas que utilizan el algoritmo AES.
En abril de 2005, Daniel J. Bernstein publicó un artículo que describe un ataque que utiliza información sobre el tiempo de ejecución de cada operación de cifrado para descifrar [15] . Este ataque requirió más de 200 millones de textos cifrados elegidos para encontrar la clave [16] .
En octubre de 2005, Doug Arne Osvik, Adi Shamir y Eran Trumer presentaron un artículo que describía varios ataques que utilizan el tiempo para encontrar una clave. Uno de los ataques presentados obtuvo la clave después de 800 operaciones de encriptación. El ataque requería que el criptoanalista pudiera ejecutar programas en el mismo sistema donde se realizó el cifrado [17] .
En diciembre de 2009, se publicó un artículo en el que el uso del análisis diferencial de errores ( eng. Differential Fault Analysis ), creado artificialmente en la matriz de estado en la octava ronda de cifrado, hizo posible recuperar la clave en 2 32 operaciones [18 ] .
diccionarios y enciclopedias |
---|
Criptosistemas simétricos | |
---|---|
Cifrados de flujo | |
Red Feistel | |
red SP | |
Otro |