2 votos

Incapaz de descifrar el algoritmo AES con OpenSSL

Estoy trabajando en un ctf juego:

Cifrado con AES en modo ECB. Todos los valores codificado en base64

ciphertext = 8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L
key = 3q1FxGhuZ5fQYbjzDxgQ35==

Traté de descifrar en mi terminal de salir de la cyphertext en base64 y el uso de la -base64 flag, sin suerte. Luego me fui a http://extranet.cryptomathic.com/aescalc, donde, después de la conversión de los valores en hexadecimal yo era capaz de descifrar:

key: DEAD45C4686E6797D061B8F30F1810DF 
text: F0B0545597C37C8EB09E0806D6E518B90B11A06774F291B01C237EF91E6B69B316F4F26658759C4AB8F2E537DF7E3E8B
out: 7B796F755F73686F756C645F6E6F745F706F73745F7468655F61637475616C5F6374665F76616C75657D5F5F5F5F5F5F

Luego regresé a mi terminal tratando de:

echo -n F0B0545597C37C8EB09E0806D6E518B90B11A06774F291B01C237EF91E6B69B316F4F26658759C4AB8F2E537DF7E3E8B | openssl enc -d -K DEAD45C4686E6797D061B8F30F1810DF -aes-128-ecb -nosalt

pero tengo el mismo error:

bad decrypt
140735124906848:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:531:

He probado esto en un Ubuntu 17.04, y ahora en mi MacOSX con OpenSSL 1.0.2 l. ¿Por qué no puedo descifrar en mi propio terminal?

5voto

Maarten Bodewes Puntos 169

Porque openssl utiliza de relleno PKCS#7 por defecto, y su texto no contiene relleno PKCS#7. Si el texto ha sido collar de entonces, ha sido collar con bytes de valor 5F. Utilice la opción -nopad en lugar de ello, relleno con valor 5F no es cualquier esquema de relleno conocen a mí; si debe ser eliminado usted tendrá que quitar a ti mismo.

Actualmente mostrar la entrada en hexadecimales. Hexadecimal es la representación de los bytes, no los valores de byte de sí mismos. Debe introducir directamente el material de origen de un archivo mediante la < para su archivo o por el hexagonal de la decodificación de la entrada.

La salida también será binario, ya que no representan ningún texto legible. Así que usted puede necesitar para convertir la salida a hexadecimales antes de comparar a los valores en su pregunta.

3voto

anguu Puntos 101

Bien, usted puede ser que desee considerar el uso de python o cualquier otro lenguaje de script/programación para hacer tales cosas.

Las ventajas de hacerlo mediante programación son:

  • Cuando usted necesita para rehacer algo similar, tendrás tu código listo.
  • Puedes escribir los comentarios para explicar lo que está pasando, por lo que si una vez que se necesitan para comprender lo que hizo anteriormente, esperemos que el código, además de los comentarios le permitirá hacerlo.
  • Muchas cosas tales como la codificación, byte manipulación, etc. son más fáciles que en la consola
  • La mayoría de los idiomas son multiplataforma, por lo que va a funcionar en Windows, Linux, Android fácilmente, si una vez que encienda el dispositivo.

En cuanto a tu problema en la mano, puede ser resuelto usando python para hacer de todo:

# we import the function we need from common librairies
from base64 import b64decode
from Crypto.Cipher import AES
from binascii import hexlify, unhexlify


# First we decode the message and the key from base64 into bytes:
msg = b64decode("8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L")
key = b64decode("3q1FxGhuZ5fQYbjzDxgQ35==")

# We then instantiate a cipher_suite using AES with the provided key, in ECB mode
cipher_suite = AES.new(key, AES.MODE_ECB)

# We can decrypt the message using our cipher_suite:
recovered = cipher_suite.decrypt(msg)

# We can print it:
print ("plaintext: ", recovered)

# There is some garbage at the end, but if we display it in hexadecimal form:
print ("in hex:", hexlify(recovered))
# We can see it's just padding using '5f', so let's create a function to remove such padding:
def unpad(padded):
  # we declare the value of our padding:
  paddingByte = unhexlify('5f')
  # we do a loop, while the last byte is padding
  while padded[-1:]==paddingByte:
    # we remove the last byte
    padded = padded[:-1]
  # once it's done, we return
  return padded

# We can now use our function to remove padding:
print ("unpadded: ", unpad(recovered))

Ahora, si usted no quiere aprender Python o cualquier otro idioma, y/o si realmente lo quieres hacer todo en su terminal, también es posible: entonces usted puede hacerlo todo directamente a través de tuberías para pasar los datos de un comando a otro, la sustitución de comandos para alimentar la tecla derecha para openssl, y los comandos base64 a manejar base64 plusxxd a convertir los datos binarios a hexadecimales (para la clave en openssl), y, finalmente, el uso de sed a quitar el 5f relleno:

echo "8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L" | base64 --decode | openssl enc -d -K $(echo "3q1FxGhuZ5fQYbjzDxgQ35==" | base64 --decode | xxd  -c 16 -ps) -aes-128-ecb -nosalt -nopad | sed 's/_*$//g'

No sé por qué, pero yo personalmente creo que el python enfoque más limpio.


Usted también mencionó que obtuvo de basura el uso de la forma Maarten Bodewes indicado, esto viene de el hecho de que usted está alimentando los valores hexadecimales a OpenSSL, mientras que usted debe proporcionar directamente los datos binarios (no el valor hexadecimal) para el mensaje, mientras que usted debe proporcionar la clave en hexadecimal:

echo -n f0b0545597c37c8eb09e0806d6e518b90b11a06774f291b01c237ef91e6b69b316f4f26658759c4ab8f2e537df7e3e8b | xxd -r -p | openssl ...

PS: usted probablemente debería evitar la publicación de los valores reales que se puede encontrar en Fasc, ya que puede estropear el juego para las personas cuyo primer reflejo es para google los valores.

2voto

Lee Chetwynd Puntos 11

decodificación base64 por

echo 8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L | base64 -D > aesdata.dat

( -D es un mac OS capricho. Linux tiende a usar -d o --decode lugar).

De forma similar:

echo 3q1FxGhuZ5fQYbjzDxgQ35== | base64 -D > aeskey.dat

pero openssl espera que los valores hexadecimales de los parámetros (pero binario en el sistema de cifrado de archivos):

xxd -p < aeskey.dat da dead45c4686e6797d061b8f30f1810df. O canalizada desde el comando anterior, si desea evitar el desorden.

Finalmente:

openssl enc -d -nopad -aes-128-ecb -K dead45c4686e6797d061b8f30f1810df -in aesdata.dat -out plain

se descifrarlo. El nopad evita el descifrado de error, como no estándar se usa relleno.

Ahora hd plain para comprobar el resultado, que es de hecho lo que estabas buscando (creo que para algunos CTF?)

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: