Se guardi FIPS 202 (il documento standard SHA-3), le funzioni di output estensibili SHAKE (XOF) sono definite in questo modo (pagine 20-21):
SHAKE128(M, d) = KECCAK[256](M || 1111, d),
SHAKE256(M, d) = KECCAK[512](M || 1111, d).
... dove M
è il messaggio da sottoporre a hash e d
è la lunghezza di output desiderata. La funzione KECCAK
è definita a pagina 20:
KECCAK[c](N, d) = SPONGE[KECCAK-p[1600, 24], pad10*1, 1600–c](N, d).
L'algoritmo SPONGE
è definito in p. 18 e specificano che il valore di d
può essere un numero intero non negativo.
Ne consegue che la dimensione dell'output consentito più breve per le funzioni SHAKE è in realtà di 0 bit .
Tabella 4 di p. 23 del documento riepiloga i livelli di sicurezza delle varie funzioni SHA. Per gli SHAKE, i livelli di sicurezza sono dati da formule che prendono come parametro la dimensione di output d
. Ad esempio, per SHAKE128:
- La resistenza alla collisione è
min(d/2, 128)
bit;
- La resistenza di preimage è
min(d, 128)
bit.
- La seconda resistenza di preimage è anche
min(d, 128)
bit.
Applicando tali formule, quando d = 0
otteniamo questi livelli di sicurezza (sia per SHAKE128 che per SHAKE256):
- 0 bit di resistenza alla collisione;
- 0 bit di pre-resistenza;
- 0 bit della seconda resistenza di pre-immagine.
Un livello di sicurezza n
-bit significa che a un utente malintenzionato è garantito il successo in non più di% tentativi di2^n
. Pertanto, un livello di sicurezza a 0 bit significa che un utente malintenzionato non supera più di 2^0
tentativi. E come prova di ciò, ecco un attacco di collisione riuscito sulla lunghezza dell'output a 0 bit SHAKE256:
SHAKE256(0x00, 0) = SHAKE256(0xff, 0)
Quindi la matematica funziona bene e le uscite SHAKE a lunghezza zero sono esattamente sicure come suonano.
Knowing that longer output is obviously better (higher entropy) [...]
Come hanno sottolineato altre risposte, più a lungo non significa necessariamente migliore. Le formule di cui sopra (pagina 23 di FIPS 202) danno una risposta precisa:
- I livelli di sicurezza di SHAKE128 e SHAKE256 come funzioni hash non possono superare rispettivamente i 128 e i 256 bit;
- Se il tuo output è abbastanza corto, il livello di sicurezza sarà inferiore a tali valori.