Pracuję nad grą CTF:
Szyfrowane za pomocą AES w trybie EBC. Wszystkie wartości zakodowane w base64
ciphertext = 8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L
key = 3q1FxGhuZ5fQYbjzDxgQ35==
Próbowałem odszyfrować go w moim terminalu, pozostawiając tekst szyfrowany w base64 i używając -base64
flagi, bez powodzenia. Potem poszedłem na http://extranet.cryptomathic.com/aescalc , gdzie po przekonwertowaniu wartości na hex mogłem odszyfrować:
key: DEAD45C4686E6797D061B8F30F1810DF
text: F0B0545597C37C8EB09E0806D6E518B90B11A06774F291B01C237EF91E6B69B316F4F26658759C4AB8F2E537DF7E3E8B
out: 7B796F755F73686F756C645F6E6F745F706F73745F7468655F61637475616C5F6374665F76616C75657D5F5F5F5F5F5F
Potem wróciłem do terminala, próbując:
echo -n F0B0545597C37C8EB09E0806D6E518B90B11A06774F291B01C237EF91E6B69B316F4F26658759C4AB8F2E537DF7E3E8B | openssl enc -d -K DEAD45C4686E6797D061B8F30F1810DF -aes-128-ecb -nosalt
ale dostałem ten sam błąd:
bad decrypt
140735124906848:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:531:
Próbowałem tego na Ubuntu 17.04, a teraz na MacOSX przy użyciu OpenSSL 1.0.2l. Dlaczego nie mogę odszyfrować we własnym terminalu?
encryption
aes
openssl
Robert
źródło
źródło
Odpowiedzi:
Ponieważ
openssl
domyślnie używa dopełniania PKCS # 7, a tekst jawny nie zawiera dopełniania PKCS # 7. Jeśli twój tekst jawny został uzupełniony, to został uzupełniony bajtami wartości5F
.-nopad
Zamiast tego użyj opcji: wypełnienie z wartością5F
nie jest żadnym znanym mi schematem wypełniania; jeśli trzeba go usunąć, musisz go usunąć samodzielnie.Obecnie wyświetlasz dane wejściowe w postaci szesnastkowej. Szesnastkowy to reprezentacja bajtów, a nie same wartości bajtów. Musisz albo bezpośrednio wprowadzić materiał źródłowy z pliku, używając
<
pliku, albo dekodować dane wejściowe w trybie szesnastkowym.Dane wyjściowe będą również binarne; nie będzie reprezentował żadnego czytelnego tekstu jawnego. Może więc być konieczne przekonwertowanie wyniku na szesnastkowe przed porównaniem go z wartościami w pytaniu.
źródło
-nopad
nie ma już komunikatów o błędach, ale dane wyjściowe są nieprawidłowe, niektóre śmieci.>
a następnie otwórz je w edytorze szesnastkowym, a następnie porównaj wyniki, nie wcześniej.Cóż, możesz rozważyć użycie Pythona lub innego języka skryptowego / programowania do takich rzeczy.
Zalety robienia tego programowo to:
Jeśli chodzi o twój problem, można go rozwiązać za pomocą Pythona, aby zrobić wszystko:
Teraz, jeśli nie chcesz nauczyć się języka Python lub innego języka i / lub naprawdę chcesz to wszystko zrobić w swoim terminalu, jest to również możliwe: wtedy możesz zrobić wszystko bezpośrednio za pomocą potoków, aby przesłać dane z jednego polecenie do drugiej, podstawienie polecenia , aby podać odpowiedni klucz do openssl, i polecenia
base64
do obsługi base64 plusxxd
do konwersji danych binarnych na hex (dla klucza w openssl), a na koniec użyjsed
do usunięcia5f
dopełnienia:Nie wiem dlaczego, ale osobiście uważam, że podejście do Pythona jest czystsze.
Wspomniałeś również, że uzyskałeś śmieci w sposób wskazany przez Maarten Bodewes, wynika to z faktu, że podajesz wartości szesnastkowe do OpenSSL, podczas gdy powinieneś podać bezpośrednio dane binarne (nie wartość szesnastkową) dla wiadomości, podczas gdy ty powinien podać klucz w systemie szesnastkowym:
PS: prawdopodobnie powinieneś unikać publikowania rzeczywistych wartości, które napotykasz w CTF, ponieważ może to zepsuć grę dla osób, których pierwszym odruchem jest wyszukanie wartości w Google.
źródło
dekodować base64 przez
echo 8LBUVZfDfI6wnggG1uUYuQsRoGd08pGwHCN++R5rabMW9PJmWHWcSrjy5Tfffj6L | base64 -D > aesdata.dat
(
-D
to dziwactwo Mac OS. Linux zwykle używa-d
lub--decode
zamiast tego).Podobnie:
echo 3q1FxGhuZ5fQYbjzDxgQ35== | base64 -D > aeskey.dat
ale openssl oczekuje wartości szesnastkowych w parametrach (ale binarnych w plikach szyfrów):
xxd -p < aeskey.dat
dajedead45c4686e6797d061b8f30f1810df
. Lub potok z poprzedniego polecenia, jeśli chcesz uniknąć bałaganu.Wreszcie:
openssl enc -d -nopad -aes-128-ecb -K dead45c4686e6797d061b8f30f1810df -in aesdata.dat -out plain
odszyfruje to. Opcja -nopad pozwala uniknąć błędu odszyfrowywania, ponieważ zastosowano niestandardowe wypełnienie.
Teraz
hd plain
sprawdź wynik, którego rzeczywiście szukałeś.źródło