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.