2010-01-21 8 views

risposta

4

Guardando il documentation, sembra che tocca a voi, l'utente biblioteca, per riempire i dati da soli. La documentazione afferma che la dimensione del blocco per AES è sempre di 16 byte, quindi è necessario eseguire il pad dei dati su un multiplo di 16 byte.

Il completamento del padding dipende dal tipo di dati. Per le stringhe l'approccio migliore è probabilmente quello di codificare la stringa in una codifica specifica e quindi prendere la lunghezza di quella codifica. In questo modo non sei basandosi su tutti i caratteri di essere rappresentato da un valore di codice a 8 bit:

plaintext = data.encode('utf-8') 
l = len(plaintext) 
ciphertext = cipher.encrypt(plaintext + ((16 - len%16) * PADDING_BYTE)) 

Un approccio simile funziona quando si è dati è un array di byte.

0 dovrebbe funzionare come PADDING_BYTE, ma è necessario fare attenzione a rimuovere il padding durante la decodifica dei dati. Potrebbe valere la pena includere la lunghezza dei dati nel testo cifrato, ad es. anteporre la lunghezza dei dati al testo in chiaro prima della crittografia, ma è necessario passare attraverso alcuni anelli per assicurarsi che il padding sia generato correttamente.

Modifica: sì, proprio come i link RFC GregS a menzioni, il modo standard di gestire il problema di lunghezza è l'uso della lunghezza del padding come byte di riempimento. Cioè se hai bisogno di 6 byte di padding il byte di padding è 0x06. Si noti che se non è necessario alcun riempimento, è necessario aggiungere un intero blocco di byte di riempimento (16 byte di 0xa0) in modo che sia possibile ripristinare il messaggio correttamente.

3

Utilizzare uno schema di riempimento standard, ad esempio lo schema delineato in PKCS-5, sezione 6.1.1 passaggio 4 (sostituire l'8 in quell'esempio con 16 se si utilizza AES).

Problemi correlati