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.