El propio AES tiene tres variantes: AES-128, AES-192 y AES-256. Internamente, los algoritmos tienen construcciones muy similares. El número es la longitud de la clave (en bits), es decir, la longitud del secreto preestablecido (AES es un cifrado de secreto compartido). Un número más alto significa no solo una clave más larga, sino también más trabajo realizado con la clave y la entrada para producir la salida.
Cada uno de estos tres algoritmos especifica dos funciones encrypt
y decrypt
; ambas funciones toman como entrada una n -bit valor ( n = 128, 192 o 256) llamada clave y un valor de 128 bits llamado bloque de entrada, y producen como salida un valor de 128 bits llamado el bloque de salida. El bloque de entrada a encrypt
se llama texto sin formato y el bloque de salida se llama texto cifrado; para decrypt
, los roles se invierten.
encrypt(key, plaintext) = ciphertext
decrypt(key, ciphertext) = plaintext
AES es un cifrado de bloque . Solo especifica cómo cifrar o descifrar un bloque de 128 bits. Si sus datos son más cortos o más largos que eso, necesita algo más sofisticado: necesita tener una
modo de operación , a menudo llamado modo de cadena porque especifica cómo para procesar un bloque tras otro. La elección del modo de encadenamiento es en gran medida independiente de la elección del algoritmo de procesamiento de bloques.
Algunos modos de encadenamiento solo requieren la clave y la entrada. Por ejemplo, ECB , el modo más simple de todos, solo dice cortar la entrada en bloques de del tamaño apropiado, aplique el algoritmo de cifrado / descifrado y pegue los bloques de salida juntos. Este modo tiene muchas fallas (por ejemplo, puede detectar repeticiones en la entrada si están alineadas con un límite de bloque; puede saber si dos mensajes cifrados son iguales porque entonces tienen el mismo texto cifrado).
Muchos modos de encadenamiento requieren una pieza de entrada adicional, generalmente un bloque de tamaño. Por lo general, se mezcla con el primer bloque de entrada de alguna manera, y se denomina vector de inicialización ( a menudo abreviado IV ). La IV se elige generalmente al azar; este es un requisito para algunos modos, mientras que para otros es suficiente nunca elegir el mismo IV dos veces para la misma tecla (lo que garantiza un sorteo aleatorio). La IV sirve (al menos) para hacer dos cifrados del mismo texto simple con la misma clave distinta. Un modo popular que usa un IV aleatorio es CBC . Otro modo popular es CTR (contador) ; su IV se llama más adecuadamente una nonce , porque no tiene que ser aleatoria, solo no repetida.
La división de la entrada en bloques solo funciona cuando es un múltiplo del tamaño del bloque. De lo contrario, el proceso habitual es dividir tantos bloques como sea posible al principio y aplicar un esquema de relleno hasta el último bloque parcial. Aunque relleno tiende a implicar que algunos bits se agregan para formar un bloque completo, el relleno de forma segura no es tan simple: un bloque parcial B con algún relleno P los riesgos agregados se confunden con un bloque completo que pasa a ser BP . Los buenos esquemas de relleno tienen que aplicar algo de relleno a todos los mensajes, incluso los que resultan ser un número exacto de bloques. Algunos modos de operación imponen un esquema de relleno particular, mientras que otros son agnósticos de relleno. Las bibliotecas criptográficas a menudo requieren que la entrada para bloquear las funciones de cifrado sean solo bloques completos, dejando la tarea de relleno a la persona que llama.
Hay modos que hacen algo más que un algoritmo de cifrado / descifrado a partir de cifrados de bloque. Los modos como CMAC hacen un código de autenticación de mensaje , es decir, una firma basada en un secreto compartido. Los modos como GCM realizan tanto el cifrado como la firma (la salida de AES- n - GCM-encrypt (clave, IV, etiqueta, texto plano) es tanto un texto cifrado como un MAC).