Nun, Sie sollten vielleicht Python oder eine andere Skript- / Programmiersprache verwenden, um solche Dinge zu tun.
Die Vorteile des Programmierens sind:
- Wann immer Sie etwas Ähnliches wiederholen müssen, haben Sie Ihren Code bereit.
- Sie können Kommentare schreiben, um zu erklären, was los ist. Wenn Sie also einmal verstehen müssen, was Sie zuvor getan haben, können Sie dies dank des Codes und der Kommentare hoffentlich tun.
- Viele Dinge wie Codierung, Byte-Handling usw. sind einfacher als in der Konsole
- Die meisten Sprachen sind plattformübergreifend, so dass es unter Windows, Linux und Android problemlos funktioniert, wenn Sie Ihr Gerät einmal umschalten.
In Bezug auf Ihr aktuelles Problem kann es mit Python gelöst werden, alles zu tun:
# 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))
Wenn Sie jetzt nicht Python oder eine andere Sprache lernen möchten und / oder wenn Sie wirklich alles in Ihrem Terminal tun möchten, ist dies auch möglich: Dann können Sie alles direkt mit Pipes tun, um die Daten von einem zu übergeben Befehl an den anderen, Befehlssubstitutions den richtigen Schlüssel zu Openssl einzuspeisen, und die Befehle base64
Base64 zu handhaben und xxd
Binärdaten hex zu konvertieren (für den Schlüssel in Openssl) und schließlich verwenden sed
die entfernen 5f
padding:
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'
Ich weiß nicht warum, aber ich persönlich finde den Python-Ansatz sauberer.
Sie haben auch erwähnt, dass Sie Müll mit der von Maarten Bodewes angegebenen Art und Weise erhalten haben, da Sie hexadezimale Werte an OpenSSL übergeben, während Sie die binären Daten (nicht den hexadezimalen Wert) der Nachricht direkt angeben sollten sollte den Schlüssel hexadezimal angeben:
echo -n f0b0545597c37c8eb09e0806d6e518b90b11a06774f291b01c237ef91e6b69b316f4f26658759c4ab8f2e537df7e3e8b | xxd -r -p | openssl ...
PS: Sie sollten es wahrscheinlich vermeiden, die tatsächlichen Werte, auf die Sie in CTFs stoßen, zu veröffentlichen, da dies das Spiel für Personen beeinträchtigen könnte, deren erster Reflex darin besteht, die Werte zu googeln.