No has encontrado un error en OpenSSL, no uno real. Sin embargo, es posible que haya encontrado un vacío en su comprensión.
Es decir, el cifrado funciona en bytes y produce bytes . Lo que ves con tus ojos son personajes . Para acomodar dispositivos orientados a caracteres (por ejemplo, sus ojos), OpenSSL aplica una codificación adicional en la salida de encriptación: toma los bytes y los convierte en caracteres, usando Base64 .
Base64 convierte cada grupo de tres bytes en una secuencia de cuatro caracteres. Los caracteres se toman de letras (mayúsculas y minúsculas), dígitos, '+' y '/'. Sin embargo, la longitud de entrada podría no ser un múltiplo de 3; En su caso, la salida AES es de 16 bytes. Los primeros 15 bytes (5 grupos de 3) están codificados en Base64 en 20 caracteres (5 secuencias de 4 caracteres). El byte solitario restante se codifica de nuevo como 4 caracteres, pero con una regla especial: los dos últimos caracteres serán signos '='.
Ahora, cuando modifica el segundo '=' y lo reemplaza con un '-', entonces está convirtiendo su cadena en algo que no es Base64 válido; sin embargo, OpenSSL todavía intentará recuperarse de él y decodificar los bytes. De hecho, la forma en que funciona OpenSSL es la siguiente: primero elimina todos los caracteres que no forman parte de los 64 caracteres Base64 "normales" (letras, dígitos, '+' y '/'). Luego procede de lo que queda (aquí, 22 caracteres). Si reemplaza un '=' con un '-', entonces simplemente está reemplazando un carácter que elimina OpenSSL, con otro carácter que también elimina OpenSSL; por lo tanto, las cosas siguen funcionando. Sin embargo, si reemplaza un '=' con un '+', OpenSSL mantendrá ese '+' y terminará con 23 caracteres, que al descodificar generarán 17 bytes, no 16. AES no le gustará una entrada cuya longitud no es un múltiplo de 16.
Todo esto tiene que ver con la codificación: la transformación de bytes en caracteres y viceversa. Encriptación no es relevante aquí.