it-swarm-eu.dev

Riempimento AES CBC quando la lunghezza del messaggio è un multiplo della dimensione del blocco

Supponendo che un testo in chiaro a 32 byte sia crittografato da AES 128 CBC - è obbligatorio aggiungere il riempimento a 16 byte, secondo i diversi schemi di riempimento?

21
moti

Il riempimento è un modo per crittografare i messaggi di una dimensione che altrimenti la crittografia a blocchi non sarebbe in grado di decrittografare; è una convenzione tra chiunque crittografa e chiunque decodifica. Se i tuoi messaggi di input hanno sempre una lunghezza che può essere elaborata con la tua modalità di crittografia (ad es. I tuoi messaggi hanno sempre una lunghezza multipla di 16), non devi aggiungere il riempimento - purché durante la decodifica, non provare a cercare un'imbottitura quando non ce n'è. Se alcuni dei tuoi messaggi richiedono il riempimento, allora dovrai aggiungere sistematicamente una sorta di riempimento, altrimenti la decrittazione sarà ambigua.

L'imbottitura non aggiunge sicurezza. La gestione del padding mal implementata può far trapelare informazioni ( oracoli di padding ) quindi devi stare attento con la tua implementazione - preferibilmente no farlo da soli.

(Certo, verrai servito meglio con una modalità di crittografia che non ha bisogno di alcun riempimento e include il controllo di integrità tanto necessario ma molto trascurato; significa GCM o EAX , non CBC.)

21
Thomas Pornin

Tutto dipende da cosa stai crittografando. Se stai crittografando dati che hanno sempre una lunghezza di 32 byte (o multipli della dimensione del blocco) non devi usare affatto il riempimento.

Se il testo in chiaro ha una lunghezza arbitraria, allora devi riempire il tuo testo e usare un meccanismo per poter separare i dati dal riempimento quando decifri.

Supponiamo che tu stia utilizzando uno schema di riempimento in cui si pad con 01 se manca un byte, con 02 02 se mancano 2 byte e così via.

Devi anche aggiungere il riempimento per il testo a 16 byte perché altrimenti se decifri un testo come

01 02 03 05 06 01 02 03 05 06 06 01

non potresti sapere se si trattava di un testo di 15 byte:

01 02 03 05 06 01 02 03 05 06 06 + 01

imbottitura di un testo a 16 byte che non era imbottito:

01 02 03 05 06 01 02 03 05 06 06 01

.

Il problema sopra è risolto sapendo che riempi sempre i tuoi dati, indipendentemente dalla lunghezza.

7
Dinu

Non è "obbligatorio" aggiungere il riempimento a un messaggio che è un multiplo della dimensione del blocco, ma la maggior parte delle implementazioni lo fanno. Il padding PKCS # 5 prescrive di aggiungere un blocco di byte, tutti impostati a zero, per dire all'algoritmo che in realtà ha tutti i blocchi che sono stati trasmessi. Ciò è utile quando l'implementazione potrebbe essere chiamata a crittografare qualsiasi cosa, di qualsiasi lunghezza, e inviarla tramite un metodo di trasporto "inaffidabile". Quando si utilizza un livello di comunicazione che ha il proprio controllo degli errori, come TCP, e quando si sa che il messaggio non imbottito è sempre un esatto multiplo della dimensione del blocco utilizzato, è ridondante.

2
KeithS