openssl aes 256 cbc error extraño

1

Esto es extremadamente extraño, pero ya lo he intentado dos veces y estoy completamente seguro de que es openSSL y no de que yo esté haciendo el error. Estoy cifrando los datos 'Higiene' con la contraseña ' * ' (lo siento, no puedo decirte esto) y obtengo el texto cifrado '3 / mEwtZdIuIV5wwsQAcnAw ==' y luego cambié el último carácter a '- 'y cuando lo desencripté todavía lo desencripto normalmente !. Luego intenté cambiarlo por cosas diferentes como '+' pero no funcionó. ¿Se supone que esto es así? ¿O acabo de encontrar otro error en openSSL?

    
pregunta Samuel Allan 18.04.2014 - 14:51
fuente

2 respuestas

2

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í.

    
respondido por el Thomas Pornin 18.04.2014 - 16:22
fuente
0

El == final es el indicador Base64 para el final de los datos codificados.

Hay una diferencia técnica entre terminar con = y == , que involucra cuántos bytes hay en el último bloque (24 bits), pero sus bytes pueden alinearse de manera que no importa. Estás haciendo que OpenSSL interprete tu cadena Base64 como 3/mEwtZdIuIV5wwsQAcnAw= con algo de basura final.

En resumen: esto no es un problema.

    
respondido por el Bill Weiss 18.04.2014 - 16:07
fuente

Lea otras preguntas en las etiquetas