Ну, вы можете рассмотреть возможность использования 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 plus 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, так как это может испортить игру людям, чей первый рефлекс - поиск значений.