openssl aes 256 cbc bug strano

1

Questo è estremamente strano ma l'ho già provato due volte e sono completamente sicuro che sia openSSL e non che io faccia il bug. Sto crittografando i dati "Igiene" con la password " * " (non posso dirlo) e ottengo il testo cifrato "3 / mEwtZdIuIV5wwsQAcnAw ==" quindi ho cambiato l'ultimo carattere in "- 'e quando l'ho decrittografato decifrava ancora normalmente !. Poi ho provato a cambiarlo in cose diverse come '+' ma non ha funzionato, dovrebbe essere così? O ho appena trovato un altro bug in openSSL?

    
posta Samuel Allan 18.04.2014 - 14:51
fonte

2 risposte

2

Non hai trovato un bug in OpenSSL, non è vero. Tuttavia, potresti aver trovato una lacuna nella tua comprensione.

Vale a dire, la crittografia funziona su byte e produce byte . Ciò che vedi con i tuoi occhi sono personaggi . Per poter ospitare dispositivi orientati ai caratteri (ad esempio i tuoi occhi), OpenSSL applica un'ulteriore codifica sull'output di crittografia: prende i byte e li trasforma in caratteri, utilizzando Base64 .

Base64 trasforma ogni gruppo di tre byte in una sequenza di quattro caratteri. I caratteri sono tratti da lettere (maiuscole e minuscole), cifre, "+" e "/". Tuttavia, la lunghezza dell'input potrebbe non essere un multiplo di 3; nel tuo caso, l'output AES è di 16 byte. I primi 15 byte (5 gruppi di 3) sono codificati in Base64 in 20 caratteri (5 sequenze di 4 caratteri). Il byte restante è codificato nuovamente come 4 caratteri, ma con una regola speciale: gli ultimi due caratteri saranno segni '='.

Ora, quando modifichi il secondo '=' e lo sostituisci con un '-', allora stai trasformando la tua stringa in qualcosa che non è Base64 valido; ancora OpenSSL proverà ancora a recuperare da esso e decodificare i byte fuori di esso. In effetti, il modo in cui OpenSSL funziona è il seguente: rimuove innanzitutto tutti i caratteri che non fanno parte dei 64 caratteri "Base" Base64 (lettere, cifre, "+" e "/"). Quindi procede da ciò che rimane (qui, 22 caratteri). Se sostituisci un '=' con un '-', allora stai semplicemente rimpiazzando un personaggio che OpenSSL rimuove, con un altro carattere che anche OpenSSL rimuove; quindi, le cose continuano a funzionare. Tuttavia, se sostituisci un '=' con un '+', allora OpenSSL manterrà quel '+' e finirà con 23 caratteri, che, dopo la decodifica, produrranno 17 byte, non 16. AES non piacerà un input la cui lunghezza non è un multiplo di 16.

Tutto ciò riguarda la codifica: trasformazione dei byte in caratteri e ritorno. La crittografia non è pertinente qui.

    
risposta data 18.04.2014 - 16:22
fonte
0

Il trailing == è l'indicatore Base64 per la fine dei dati codificati.

C'è una differenza tecnica tra il finire con = e == , che coinvolge quanti byte ci sono nell'ultimo blocco (24 bit), ma i tuoi byte possono essere allineati in modo che non siano importanti. Stai facendo in modo che OpenSSL interpreti la tua stringa Base64 come 3/mEwtZdIuIV5wwsQAcnAw= con qualche garbo finale.

In breve: questo non è un problema.

    
risposta data 18.04.2014 - 16:07
fonte

Leggi altre domande sui tag