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

18

Supponendo che un testo in chiaro a 32 byte sia crittografato da AES 128 CBC - è obbligatorio aggiungere padding di 16 byte, in base ai diversi schemi di padding?

    
posta moti 31.01.2013 - 10:49
fonte

3 risposte

20

Il riempimento è un modo per crittografare i messaggi di una dimensione che il codice a blocchi non sarebbe in grado di decifrare altrimenti; è una convenzione tra chiunque cripta e chiunque decifri. Se i tuoi messaggi di input hanno sempre una lunghezza che può essere elaborata con la tua modalità di crittografia (ad esempio i tuoi messaggi hanno sempre un multiplo di 16), non devi aggiungere padding - fino a durante la decrittografia , non provi a cercare un'imbottitura quando non ce n'è. Se alcuni dei tuoi messaggi richiedono il padding, dovrai aggiungere una sorta di padding sistematicamente, altrimenti la decrittografia sarà ambigua.

Il riempimento non aggiunge sicurezza. La gestione di gestione implementata male può perdere informazioni ( oracle di riempimento ) quindi devi stare attento con il tuo implementazione - preferibilmente non farlo da soli.

(Ovviamente, sarebbe meglio servire con una modalità di crittografia che non ha bisogno di padding e include il tanto necessario ma molto trascurato controllo di integrità, che significherebbe GCM o EAX , non CBC. )

    
risposta data 31.01.2013 - 13:15
fonte
7

Dipende tutto da cosa stai crittografando. Se si stanno crittografando dati che hanno sempre una lunghezza di 32 byte (o multipli della dimensione del blocco) non è necessario utilizzare il padding.

Se il testo semplice ha una lunghezza arbitraria, devi eseguire il pad del testo e utilizzare un meccanismo per poter separare i dati dal padding quando decifri.

Supponiamo che tu stia usando uno schema di padding in cui premi 01 se manca un byte, con 02 02 se mancano 2 byte e così via.

Devi anche aggiungere padding per il testo a 16 byte, altrimenti se decifri un testo come

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

non sarai in grado di sapere se si tratta di un testo di 15 byte:

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

padding un testo di 16 byte che non è stato riempito:

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

.

Il problema precedente viene risolto sapendo che i dati vengono sempre aggiornati, indipendentemente dalla lunghezza.

    
risposta data 31.01.2013 - 11:30
fonte
2

Non è "obbligatorio" aggiungere padding a un messaggio che è un multiplo della dimensione del blocco, ma la maggior parte delle implementazioni lo fa. Il padding PKCS # 5 prescrive di aggiungere un blocco di byte, il tutto impostato a zero, per dire all'algoritmo che in effetti ha tutti i blocchi che sono stati trasmessi. Ciò è utile quando l'implementazione può essere chiamata per 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 inserito è sempre un multiplo esatto della dimensione del blocco utilizzata, è ridondante.

    
risposta data 31.01.2013 - 17:05
fonte

Leggi altre domande sui tag