Si mira FIPS 202 (el documento estándar SHA-3), Las funciones de salida ampliable SHAKE (XOF) se definen así (pp. 20-21):
SHAKE128(M, d) = KECCAK[256](M || 1111, d),
SHAKE256(M, d) = KECCAK[512](M || 1111, d).
... donde M
es el mensaje que se va a hashear y d
es la longitud de salida deseada. La función KECCAK
se define en la página 20:
KECCAK[c](N, d) = SPONGE[KECCAK-p[1600, 24], pad10*1, 1600–c](N, d).
El algoritmo SPONGE
se define en p. 18, y especifican que el valor de d
puede ser cualquier entero no negativo.
Se deduce que el tamaño de salida más corto permitido para las funciones SHAKE es en realidad 0 bits .
Tabla 4 en p. 23 del documento resume los niveles de seguridad de las diversas funciones de SHA. Para los SHAKE, los niveles de seguridad vienen dados por fórmulas que toman el tamaño de salida d
como parámetro. Por ejemplo, para SHAKE128:
- La resistencia a la colisión es
min(d/2, 128)
bits;
- La resistencia de preimagen es
min(d, 128)
bits.
- La segunda resistencia de preimagen también es
min(d, 128)
bits.
Aplicando esas fórmulas, cuando d = 0
obtenemos estos niveles de seguridad (para SHAKE128 y SHAKE256):
- 0 bits de resistencia a la colisión;
- 0 bits de resistencia de preimagen;
- 0 bits de la segunda resistencia de preimagen.
Un nivel de seguridad de n
-bit significa que se garantiza que un atacante tendrá éxito en no más de 2^n
de intentos. Por lo tanto, un nivel de seguridad de 0 bits significa que un atacante no logra más que 2^0
de intentos. Y como prueba de ello, he aquí un exitoso ataque de colisión en la longitud de salida de 0 bits SHAKE256:
SHAKE256(0x00, 0) = SHAKE256(0xff, 0)
Así que las matemáticas funcionan bien, y las salidas SHAKE de longitud cero son exactamente tan seguras como suenan.
Sabiendo que una salida más larga es obviamente mejor (mayor entropía) [...]
Como han señalado otras respuestas, ya no significa necesariamente mejor. Las fórmulas a las que me referí anteriormente (p. 23 de FIPS 202) dan una respuesta precisa:
- Los niveles de seguridad de SHAKE128 y SHAKE256 como funciones hash no pueden exceder los 128 y 256 bits respectivamente;
- Si su salida es lo suficientemente corta, el nivel de seguridad estará por debajo de esos valores.