Suponiendo que no hay vulnerabilidades en el cifrado para diferentes longitudes de clave, y que la función de derivación de clave genera una salida indistinguible de aleatoria, sin colisiones, entonces:
Hablando matemáticamente 2 ^ 256 = 2 ^ 128 * 2 ^ 128. El álgebra 2^X
en este caso se refiere al número total de claves únicas, llamado espacio de claves. Como cada bit puede ser cero o uno, hay dos posibilidades. Dos bits le da 2x2, tres 2x2x2 y así sucesivamente.
De todos modos, como digo, 2 ^ 256 = 2 ^ 128 * 2 ^ 128 desde 2 ^ 128 * 2 ^ 128 = 2 ^ (128 + 128). Al duplicar el espacio de direcciones, no se ha duplicado el número de claves posibles, sino que se han creado 340282366920938463463374607431768211456 claves adicionales posibles. Si 2 ^ 128 está fuera del alcance de la humanidad, entonces 2 ^ 256 está fuera del alcance de Skynet.
Si uso la misma contraseña, ¿realmente importa cuál es el tamaño de la clave?
Eso depende de KDF - PBKDF2, por ejemplo, genera bloques de la función de hash con clave suministrada como entrada - y luego alimenta esto en la siguiente iteración como la sal. Como tales, los primeros 160 bits de la clave generada para una clave de 128 bits son los mismos que los primeros 160 bits de la clave generada para una clave de 256 bits.
La pregunta es, entonces, ¿esto compromete la clave? Bueno, en realidad no tienes ningún valor almacenado con el que trabajar, para empezar, pero supongamos que de alguna manera tienes una clave de 128 bits. Necesitará poder generar de manera confiable los otros 128 bits para generar la clave de 256 bits, lo que no puede hacer desde la salida a menos que tenga la entrada. Así que necesitarías encontrar la preimagen, la contraseña. Eso podría considerarse fácil, excepto que tendría que interrumpir muchas de las iteraciones de la función HMAC que se utilizaron.
Otra pregunta sería ¿es reutilizable ? La implementación adecuada de PBKDF2 usa un salt, por lo que tendría el mismo problema que atacar cualquier función de hash con sal.
¿la fuerza del cifrado no es más una función de la fuerza de la contraseña que el tamaño de la clave?
En realidad no. Sin embargo, el problema es que una técnica deficiente de generación de claves puede llevarlo a reducir inadvertidamente el tamaño de su espacio de claves, lo que facilita la fuerza bruta de su contraseña. Por ejemplo:
char encryption_key[16] = {0};
strncpy(encryption_key, 16, source);
aes_with_some_mode(encryption_key, plaintext, &ciphertext);
es malo, ya que incluso si se asegura de que la contraseña tenga 16 bytes de longitud, ha restringido cada byte a uno de una serie de posibles caracteres y símbolos ASCII. Por lo tanto, asumiendo solo caracteres en mayúsculas, ha reducido el espacio clave a solo 26 ^ 16. Te acabas de disparar en el pie por un factor de aproximadamente 8 x 10 ^ 15.
Los KDF están diseñados para evitar esta situación (aunque una fuente verdaderamente aleatoria es más ideal) al asignar la contraseña al espacio clave. El problema de encontrar una clave coincidente se vuelve tan difícil como encontrar una imagen previa de un algoritmo hash en las condiciones en que se usa en el KDF.
Ciertamente, con PBKDF2 no sería cierto que el KDF tomaría el mismo tiempo para una clave de 128 y 256 bits.