Ну, вы можете рассмотреть возможность использования Python или любого другого языка сценариев / программирования для таких вещей.
Преимущества выполнения этого программно:
- Всякий раз, когда вам нужно будет повторить что-то подобное, ваш код будет готов.
- Вы можете написать комментарии, чтобы объяснить, что происходит, поэтому, если вам когда-нибудь понадобится понять, что вы делали ранее, надеюсь, код и комментарии позволят вам это сделать.
- Многие вещи, такие как кодирование, обработка байтов и т.д., Проще, чем в консоли
- Большинство языков являются кроссплатформенными, поэтому они легко будут работать в Windows, Linux, Android, если вы когда-нибудь переключите свое устройство.
Что касается вашей проблемы, она может быть решена с помощью Python, чтобы сделать все:
# 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))
Теперь, если вы не хотите изучать Python или любой другой язык и / или если вы действительно хотите делать все это в своем терминале, это также возможно: тогда вы можете делать все напрямую, используя каналы для передачи данных из одного команду другому, команду подстановки для подачи правого ключа в openssl и команды base64
для обработки base64 плюс xxd
для преобразования двоичных данных в шестнадцатеричные (для ключа в openssl) и, наконец, для удаления отступа sed
используйте 5f
:
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'
Я не знаю почему, но лично я считаю, что подход к Python чище.
Вы также упомянули, что получили мусор, как указал вам Мартен Бодьюс, это связано с тем, что вы подаете шестнадцатеричные значения в OpenSSL, в то время как вы должны предоставить двоичные данные (а не шестнадцатеричное значение) для сообщения, пока вы должен предоставить ключ в шестнадцатеричном виде:
echo -n f0b0545597c37c8eb09e0806d6e518b90b11a06774f291b01c237ef91e6b69b316f4f26658759c4ab8f2e537df7e3e8b | xxd -r -p | openssl ...
PS: вам, вероятно, следует избегать публикации фактических значений, с которыми вы сталкиваетесь в CTF, так как это может испортить игру людям, чей первый рефлекс - поиск значений в Google.