Suponiendo que un texto plano de 32 bytes esté cifrado por AES 128 CBC, ¿es obligatorio agregar un relleno de 16 bytes, de acuerdo con los diferentes esquemas de relleno?
El relleno es una forma de cifrar mensajes de un tamaño que el cifrado de bloque no podría descifrar de otra manera; es una convención entre quien encripta y quien desencripta. Si sus mensajes de entrada siempre tienen una longitud que puede procesarse con su modo de encriptación (por ejemplo, sus mensajes siempre tienen una longitud múltiple de 16), entonces no tiene que agregar relleno - siempre que durante el descifrado , no intentes buscar un relleno cuando no hay ninguno. Si algunos de sus mensajes requieren relleno, entonces tendrá que agregar algún tipo de relleno de forma sistemática, de lo contrario, el descifrado será ambiguo.
El relleno no agrega seguridad. La mala gestión del relleno puede filtrar información ( oráculos de relleno ), por lo que debe tener cuidado con su Implementación, preferiblemente al no hacerlo usted mismo.
(Por supuesto, sería mejor que te sirvieran con un modo de cifrado que no necesita ningún relleno y incluye la verificación de integridad muy necesaria pero que se pasa por alto; eso significaría GCM o EAX , no CBC. )
Todo depende de lo que estés cifrando. Si está cifrando datos que siempre tienen una longitud de 32 bytes (o múltiplos del tamaño de bloque) no tiene que usar ningún tipo de relleno.
Si el texto sin formato tiene una longitud arbitraria, debe rellenar el texto y utilizar un mecanismo para poder separar los datos del relleno cuando descifre.
Supongamos que está utilizando un esquema de relleno en el que rellena con 01 si falta un byte, con 02 02 si faltan 2 bytes, etc.
También tiene que agregar un relleno para el texto de 16 bytes porque de lo contrario, si descifra un texto como
01 02 03 05 06 01 02 03 05 06 06 01
no podría saber si se trataba de un texto de 15 bytes:
01 02 03 05 06 01 02 03 05 06 06 + 01
relleno un texto de 16 bytes que no se rellenó:
01 02 03 05 06 01 02 03 05 06 06 01
.
El problema anterior se resuelve al saber que siempre rellenas tus datos, sin importar la longitud.
No es "obligatorio" agregar relleno a un mensaje que es un múltiplo del tamaño de bloque, pero la mayoría de las implementaciones lo hacen. El relleno PKCS # 5 prescribe agregar un bloque de bytes, todo puesto a cero, para indicar al algoritmo que, de hecho, tiene todos los bloques que se transmitieron. Esto es útil cuando se puede solicitar la implementación para cifrar cualquier cosa, de cualquier longitud, y enviarla a través de un método de transporte "no confiable". Cuando se utiliza una capa de comunicaciones que tiene su propia comprobación de errores, como TCP, y cuando se sabe que el mensaje sin relleno es siempre un múltiplo exacto del tamaño de bloque utilizado, es redundante.
Lea otras preguntas en las etiquetas encryption aes