Böyle şeyler yapmak için python veya başka bir scripting / programlama dili kullanmayı düşünebilirsiniz.
Programlı olarak yapmanın avantajları:
- Ne zaman benzer bir şey yinelemeniz gerektiğinde, kodunuzu hazır olacak.
- Neler olup bittiğini açıklamak için yorumlar yazabilirsiniz, bu yüzden bir kez daha önce ne yaptığınızı anlamanız gerekirse, umarım kod artı yorumlar size bunu sağlayacaktır.
- Kodlama, bayt kullanımı vb. Birçok şey konsoldan daha kolaydır.
- Çoğu dil çapraz platformdur, bu nedenle bir kez cihazınızı değiştirirseniz kolayca Windows, Linux, Android üzerinde çalışır.
Eldeki probleminizle ilgili olarak, her şeyi yapmak için python kullanılarak çözülebilir:
# 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))
Şimdi, Python veya başka bir dil öğrenmek istemiyorsanız ve / veya Gerçekten mi hepsini terminalinizde yapmak istiyorsanız, bu da mümkündür:
sonra doğrudan kullanarak her şeyi yapabilirsin borular Verileri bir komuttan diğerine geçirmek için, komut değiştirme openssl ve komutları için doğru anahtarı beslemek için base64
base64 plus'ı kullanmak için xxd
İkili verileri hex'e çevirmek (openssl içindeki anahtar için) ve en sonunda kullan sed
kaldırmak için 5f
dolgu malzemesi:
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'
Nedenini bilmiyorum, ama şahsen python yaklaşımını daha temiz buluyorum.
Ayrıca, Maarten Bodewes'in size bildirdiği şekilde çöp aldığınızı da belirtmiştiniz, bu onaltılı değerleri OpenSSL'ye verdiğiniz gerçeğinden geliyor. doğrudan ikili veri (onaltılık değil) mesaj için, onaltılık bir anahtar sağlamanız gerekirken:
echo -n f0b0545597c37c8eb09e0806d6e518b90b11a06774f291b01c237ef91e6b69b316f4f26658759c4ab8f2e537df7e3e8b | xxd -r -p | openssl ...
Not: Muhtemelen CTF'lerde karşılaştığınız gerçek değerleri yayınlamaktan kaçınmalısınız, çünkü ilk refleksi değerleri google alan kişi için oyunu mahvedebilir.