Pytanie:
Jak ustalić, jaki typ kodowania / szyfrowania został użyty?
Karthik
2011-05-20 16:12:11 UTC
view on stackexchange narkive permalink

Czy istnieje sposób, aby dowiedzieć się, jaki typ szyfrowania / kodowania jest używany? Na przykład testuję aplikację internetową, która przechowuje hasło w bazie danych w formacie zaszyfrowanym ( WeJcFMQ / 8 + 8QJ / w0hHh + 0g == ). Jak mogę określić, jakie hashowanie lub szyfrowanie jest używane?

Część treści (lub odsyłaczy do) metodologii ma na celu wyjaśnienie, jak zidentyfikować określone typy kryptowalut lub kodowania w scenariuszu z całkowicie zerową wiedzą. Większość z tych odpowiedzi brzmi „to niemożliwe”, a moje przeczucie podpowiada mi, że nic w naszej branży nie jest niemożliwe.
@atdre Dzięki za nagrodę. Wydaje się, że pytanie skupia się na formatach haszowania haseł - czy na tym też się skupiasz? Wydaje mi się, że to najlepsze, a jeśli ludzie chcą odpowiedzieć na pytanie dotyczące formatów plików, mogą zadać inne pytanie.
@atdre: „Niemożliwe” jest zwykle skrótem od „niewykonalne przy obecnej technologii / nie zakończy się przed śmiercią wszechświata na gorąco”.
@nealmcb: Identyfikacja zaszyfrowanego lub zakodowanego tekstu innego niż zwykły.
Zadałem podobne pytanie na SE: http://stackoverflow.com/questions/988642/how-would-i-reverse-engineer-a-cryptographic-algorithm
Możesz użyć wykrywacza online, takiego jak: [https://md5hashing.net/hash_type_checker](https://md5hashing.net/hash_type_checker) w twoim przypadku oznacza to: ** Base64 ** Encoding
Dziewięć odpowiedzi:
Thomas Pornin
2011-05-23 20:00:49 UTC
view on stackexchange narkive permalink

Twój przykładowy ciąg ( WeJcFMQ / 8 + 8QJ / w0hHh + 0g == ) to kodowanie Base64 dla sekwencji 16 bajtów, które nie wyglądają na znaczące ASCII lub UTF-8. Jeśli jest to wartość przechowywana na potrzeby weryfikacji hasła (tj. nie jest to naprawdę „zaszyfrowane” hasło, a raczej „zaszyfrowane” hasło), to prawdopodobnie jest to wynikiem funkcji skrótu obliczone na podstawie hasła; jedyną klasyczną funkcją mieszającą z 128-bitowym wyjściem jest MD5. Ale może to dotyczyć wszystkiego.

„Normalnym” sposobem poznania tego jest spojrzenie na kod aplikacji. Kod aplikacji jest wcielany w namacalny, gruby sposób (pliki wykonywalne na serwerze, kod źródłowy gdzieś ...), który nie jest i nie może być tak dobrze chroniony, jak może to zrobić klucz tajny. Tak więc inżynieria odwrotna jest najlepszym rozwiązaniem.

Oprócz inżynierii odwrotnej możesz przeprowadzić kilka eksperymentów, aby spróbować zgadnąć:

  • Jeśli ten sam użytkownik ” zmienia ”swoje hasło, ale używa tego samego, czy wartość przechowywana zmienia się? Jeśli tak, to część wartości jest prawdopodobnie losową „solą” lub IV (przy założeniu szyfrowania symetrycznego).
  • Zakładając, że wartość jest deterministyczna na podstawie hasła dla danego użytkownika, jeśli dwóch użytkowników wybierze to samo hasło, czy skutkuje tą samą przechowywaną wartością? Jeśli nie, to prawdopodobnie nazwa użytkownika jest częścią obliczeń. Możesz spróbować obliczyć MD5 („nazwa użytkownika: hasło”) lub inne podobne warianty, aby sprawdzić, czy otrzymasz dopasowanie.
  • Czy długość hasła jest ograniczona? Mianowicie, jeśli ustawisz 40-znakowe hasło i nie możesz pomyślnie uwierzytelnić się, wpisując tylko pierwsze 39 znaków, oznacza to, że wszystkie znaki są ważne, a to oznacza, że ​​to naprawdę jest haszowanie hasła, a nie szyfrowanie (przechowywana wartość służy do weryfikacji hasła, ale hasła nie można odzyskać z samej przechowywanej wartości).
Dzięki za dane wejściowe ... Proszę, powiedz mi więcej o tym, jak potwierdziłeś, że jest to kodowanie Base64 dla sekwencji 16 bajtów. ** Jeśli chodzi o Twoje eksperymenty, ** Tak, to jest wartość przechowywana na potrzeby weryfikacji hasła. 1) jeśli użytkownik zmieni hasło, zmieni się również przechowywana wartość. 2) jeśli dwóch użytkowników wybierze to samo hasło, to wartość przechowywana jest taka sama. 3) Długość hasła nie jest ograniczona.
@Learner: _dowolna_ sekwencja 24 znaków, taka że pierwsze 22 to litery, cyfry, „+” lub „/”, a ostatnie dwa znaki „=”, jest prawidłowym kodowaniem Base64 o wartości 128-bitowej. A każda 128-bitowa wartość, zakodowana w Base64, daje taką sekwencję.
To jest właściwa odpowiedź, chociaż chciałem usłyszeć kilka potencjalnych sztuczek, jeśli kod aplikacji nie jest dostępny. Jeśli masz do czynienia z aplikacją binarną o zamkniętym kodzie źródłowym - sprawdź http://aluigi.org/mytoolz.htm#signsrch
Jeśli jest to MD5, możesz wypróbować dowolną z witryn do łamania MD5, takich jak http://www.md5decrypter.co.uk/. Żaden z nich nie jest szybki ani nie gwarantuje wyniku. Google dla „łamania md5”, aby znaleźć więcej. Dzięki temu uzyskasz również rozszerzoną listę produktów pod adresem http://www.stottmeister.com/blog/2009/04/14/how-to-crack-md5-passwords/
john
2011-05-20 16:22:41 UTC
view on stackexchange narkive permalink

Edycja: właśnie zauważyłem bardzo fajny skrypt o nazwie hashID. Nazwa prawie to opisuje.

~~~

Ogólnie rzecz biorąc, wykorzystanie doświadczenia do tworzenia przemyślanych przypuszczeń jest sposobem wykonywania tych czynności.

Oto lista z bardzo dużą liczbą wyników haszowania, dzięki czemu wiesz, jak każdy z nich wygląda i tworzysz podpisy / wzory lub po prostu weryfikujesz optycznie.

Najpierw są dwie główne rzeczy zwróć uwagę na:

  • długość skrótu (każda funkcja skrótu ma określoną długość wyjściową)
  • użyty alfabet (czy wszystkie angielskie litery? cyfry 0-9 i AF so hex? Jakie znaki specjalne są jeśli w ogóle?)

Kilka programów do łamania haseł (na przykład John the ripper) stosuje pewne dopasowanie wzorców na wejściu, aby odgadnąć użyty algorytm, ale to działa tylko w przypadku ogólnych skrótów. Na przykład, jeśli weźmiesz jakieś hashowanie i obrócisz każdą literę o 1, większość schematów dopasowywania wzorców zawiedzie.

dziękuję ... spojrzałem i spróbowałem z kilkoma hasłami. ale metoda działa, biorąc pod uwagę scenariusz, o którym wiemy, że hasło jest zaszyfrowane, a nie zaszyfrowane, prawda?
Hasła zwykle nie są zaszyfrowane, są zaszyfrowane i zwykle reprezentowane w formie, w której funkcja je generuje - więc wiele z tych formularzy można znaleźć w linkach powyżej. Ostatecznie dane wyjściowe wszystkich funkcji to tylko cyfry binarne, które są zwykle reprezentowane i przechowywane albo jako reprezentacja szesnastkowa, albo jako reprezentacja base64.
Ten program to śmieć.Nie może nawet zidentyfikować skrótu base64.
Base64 nie jest hashem, to kodowanie.
Yaur
2011-05-23 08:34:11 UTC
view on stackexchange narkive permalink

Przesłałeś 16 bajtów (128 bitów) danych zakodowanych w standardzie 64. Fakt, że jest on zakodowany w oparciu o 64, niewiele nam mówi, ponieważ podstawa 64 nie jest algorytmem szyfrowania / mieszania, ale jest sposobem na zakodowanie danych binarnych na tekst. Oznacza to, że ten blok zawiera jedną przydatną informację, a mianowicie, że dane wyjściowe mają długość 16 bajtów. Możemy to porównać do rozmiaru bloku powszechnie używanych schematów i dowiedzieć się, czego to nie może być. Zdecydowanie najpowszechniejsze schematy to:

Następną rzeczą, którą musimy zrobić, jest przyjrzenie się innym blokom zaszyfrowanego tekstu, aby znaleźć odpowiedź na następujące pytanie:

  • Czy wszystkie zaszyfrowane teksty są tej samej długości, nawet dla różnych długości wejściowych?

Jeśli nie wszystkie bloki są tej samej długości, nie patrzysz na algorytm haszujący, ale szyfrowania. Ponieważ dane wyjściowe zawsze będą wielokrotnością podstawowego rozmiaru bloku, obecność bloku, który nie jest równo podzielny przez 16 bajtów, oznaczałaby, że nie może to być AES i dlatego musi być DES lub 3DES.

Jeśli mają możliwość wprowadzenia hasła i obserwowania wyników, które można ustalić bardzo szybko. Wystarczy wpisać 17-znakowe hasło i sprawdzić długość. Jeśli masz 16 bajtów, masz MD5, 20 bajtów oznacza SHA-1, 24 bajty oznacza DES lub 3DES, 32 bajty oznacza AES.

:-p nie rozumiem .. czy są to dane zakodowane w oparciu o 64 dane? w jaki sposób? i zdecydowanie nie dostałem części, w której mówisz "jeśli jakieś bloki nie są podzielne równo przez 16 bajtów, prawdopodobnie jest to DES lub 3DES, w przeciwnym razie najprawdopodobniej AES" rzuciło mi trochę światła na to. :)
@The Learner Dodałem do odpowiedzi, miejmy nadzieję, że będzie jaśniejsza. Jeśli możesz użyć wybranego tekstu jawnego, prawdopodobnie możesz to rozwiązać na tej podstawie.
dziękuję bardzo ... zaczynam rozumieć drugą część. a po zadaniu tego pytania przeczytałem gdzieś w google, że haszowanie to wiele do jednego, co oznacza, że ​​wiele różnych tekstów można zaszyfrować do tego samego wyjścia (proszę poprawić mnie, jeśli się mylę). dochodząc do naszego scenariusza, wszystkie bloki tekstu zaszyfrowanego nie są tej samej długości ... więc czy teraz mogę mieć pewność, że nie są one zaszyfrowane, ale zaszyfrowane? Ale nadal nie rozumiem, jak powiedziałeś, że dane, które opublikowałem, to 16 bajtów danych zakodowanych w oparciu o 64. Jeśli istnieje szyfr lub hash, skąd mam wiedzieć, że są to dane 16- lub 32-bajtowe?
@the learner the = as dopełnienie jest charakterystyczne dla base64. To narzędzie http://home2.paulschou.net/tools/xlate/ (z wyszukiwarki google na dekoderze base64 hex) konwertuje z bazy 64 na tablicę wartości szesnastkowych. po prostu wklej swój tekst do podstawowego pola 64 i kliknij dekoduj i policz bajty. można również oszacować, biorąc liczbę znaków w ciągu base64 i mnożąc przez 0,75
@Karthik, istnieje bardzo niewiele sposobów na przedstawienie liczby (co będzie wynikiem końcowym haszowania lub szyfrowania) jako zwartego, czytelnego dla człowieka tekstu.Dominującymi sposobami są szesnastkowe (A-F, 0-9) i podstawa 64 (A-Z, a-z, 0-9, +, /).Istnieje również techniczna możliwość próby wyświetlenia danych jako kodowania tekstu (ASCII, UTF-8 itp.), Chociaż zazwyczaj jest to tylko oznaka braku wiedzy, jak wyświetlić dane (np. Próba otwarcia pliku binarnego wnotatnik).Rozpoznasz go głównie po prostu patrząc, jakie rodzaje postaci pojawiają się i odgadując.
Wtedy podstawa 64 ma również charakterystyczne wypełnienie (`=` s).To naprawdę największy wskaźnik bycia base64.Ale potem musisz pamiętać, że wiele miejsc nie przechowuje * tylko * hasha, ale w rzeczywistości ma reprezentację tekstową, która zawiera separatory i inne pola (np. Dla soli, identyfikator, którego algorytm haszujący został użyty itp.).To, szczerze mówiąc, pozwala na zebranie znacznie większej ilości informacji, ale nie ma tutaj zastosowania.Należy o tym pamiętać, ponieważ te inne znaki nie są częścią sposobu kodowania danych.
bethlakshmi
2011-05-20 22:47:36 UTC
view on stackexchange narkive permalink

To zależy od formatu - niektóre protokoły do ​​przechowywania zaszyfrowanego tekstu mają część w postaci zwykłego tekstu, która określa sposób szyfrowania. Z twojego przykładu mam wątpliwości, ponieważ ciąg, do którego się odnosisz, jest tak krótki, że wygląda na to, że jest to tylko zaszyfrowany tekst.

Zasugerowałbym kilka przemyśleń:

  • Znak „==” na końcu z pewnością byłby dopełnieniem, więc nie uwzględniaj go w żadnych próbach odszyfrowania.

  • Być może masz do czynienia z hashem lub zasolony hash zamiast szyfrowania. W takim przypadku próba „odszyfrowania” danych nie zadziała - musisz dopasować hasła, używając tej samej wartości skrótu i ​​/ lub soli, które były używane pierwotnie. Nie ma możliwości uzyskania oryginalnego hasła za pomocą zasolonego hasła.

  • Absolutnie najlepszym rozwiązaniem jest zdobycie kopii kodu używanego do przechowywania haseł. Gdzieś tam hasła przechodzą operację kryptograficzną. Znajdź kod, aby dowiedzieć się, co się tutaj dzieje. 9 razy na 10 używają jakiegoś API do haszowania / solenia / szyfrowania i możesz je naśladować lub odwracać za pomocą tego samego API.

Znak `==` na końcu jest znakiem ostrzegawczym wartości kodowanej algorytmem base64. Wyściółka jest konieczna; nie * po prostu * upuść * tego. Najpierw dekodujesz dane base64, A NASTĘPNIE bawisz się nimi.
Możesz przyciąć wypełnienie, ponieważ możesz je obliczyć na podstawie długości wiadomości. Aby użyć base64 w querystringu, musisz prawie przejść przez transformację webSafeBase64, a następnie odwrócić proces przed dekodowaniem.
Jeff Ferland
2011-05-23 20:17:42 UTC
view on stackexchange narkive permalink

Ogólnie można się domyślić kodowania. Na przykład ciąg, który zamieściłeś w swoim pytaniu, jest zakodowany w formacie Base64. Znaki równości są wypełnione w schemacie Base64. To coś, co wiem na pierwszy rzut oka z doświadczenia.

Jeśli podałeś mi łańcuch, który był zaszyfrowany, być może będę w stanie powiedzieć ci kodowanie, ale nie mogę ci powiedzieć algorytmu użytego do zaszyfrowania, chyba że dostępne są jakieś metadane. Powód jest następujący: algorytmy szyfrujące działają na zasadzie generowania danych, które wydają się być przypadkowymi danymi. Gdybym zaszyfrował dwa zdania, każde z dwoma szyfrem (cztery wyjścia), nie byłbyś w stanie powiedzieć mi z całą pewnością, który szyfr należy do którego szyfru, chyba że go odszyfrujesz lub złamiesz szyfr.

W odniesieniu do twojego W konkretnym przypadku hasła są zwykle haszowane. Oznacza to, że nie możesz odzyskać hasła z hasha, ale możesz przetestować, czy hash pasuje do hasła. Pod tym względem @ john's answer jest świetna. Jeśli możesz wprowadzić hasło, które znasz, a następnie wypróbować popularne schematy, możesz dowiedzieć się, jaki skrót jest używany.

Ilmari Karonen
2011-10-20 16:23:25 UTC
view on stackexchange narkive permalink

Jeśli to rzeczywiście jest prosty skrót hasła, możemy być w stanie użyć Google, aby go złamać. Jednak Base64 jest trudny do wyszukania ze wszystkimi tymi ukośnikami i znakami plus, więc najpierw przekonwertujmy ten hash na szesnastkowy:

  $ perl -MMIME :: Base64 -le 'print unpack "H * ", decode_base64" WeJcFMQ / 8 + 8QJ / w0hHh + 0g == "'59e25c14c43ff3ef1027fc3484787ed2  

OK, teraz możemy Google do tego. W tej chwili dostaję tylko jedno trafienie z md5this.com - choć oczywiście wkrótce będzie ich więcej, łącznie z tym postem.

Niestety (a może na szczęście, w zależności od punktu widzenia), nie udało nam się znaleźć obrazu wstępnego (witryna obecnie określa ten hash jako „cracking ...”), ale fakt, że w ogóle znajduje się na tej liście zdecydowanie sugeruje, że jest to rzeczywiście niesolony skrót MD5 prawdziwego hasła.

Bardzo ciekawe, jak Google może pomóc w tej sytuacji.Dobra akcja!
Nam Nguyen
2011-05-20 18:01:55 UTC
view on stackexchange narkive permalink

Jedynym sposobem jest zgadywanie. Z doświadczeniem, zgadywanie będzie bardziej poprawne.

Na przykład: W oparciu o długość wyjścia: wyjście MD5 ma 128 bitów lub 16 bajtów, wyjście SHA1 ma 160 bitów lub 20 bajtów. Bazując na zestawie znaków wyjściowych: BASE64 generuje wynik ze znakami drukowalnymi.

Ostatecznie metoda prób i błędów uczy Cię, jak to zrobić.

user185
2011-05-20 18:26:47 UTC
view on stackexchange narkive permalink

Jedynym sposobem jest użycie pewnych metadanych, które o tym mówią. Na przykład ostatnio pracowałem z plikami PDF, a format zawiera słownik zawierający filtr, algorytm, rozmiar klucza itp. Ale jeśli wszystko, co masz, to zaszyfrowany tekst, to wszystko, co masz, to nieprzezroczysta kropla dane.

mti2935
2020-03-24 19:03:59 UTC
view on stackexchange narkive permalink

To jest bardzo słabe zabezpieczenie pod każdym względem! Zwykły tekst to P4 $$ w0rdP4 $$ w0rd i jest zaszyfrowany przy użyciu szyfrowania XOR z kluczem CdZ4MLMPgYtAE9gQ80gMtg == . W ten sposób powstaje zaszyfrowany tekst wysłany przez powyższego OP, WeJcFMQ/8+8QJ/w0hHh+0g==”.

Aby zweryfikować:

Najpierw użyj xxd aby uzyskać bazowy plik binarny zwykłego tekstu:

  echo -n 'P4 $$ w0rdP4 $$ w0rd' | xxd -b -c16  

Daje to:

  01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  

Następnie dekoduj klucz base64 i użyj xxd, aby uzyskać bazowy plik binarny klucza:

  echo -n 'CdZ4MLMPgYtAE9gQ80gMtg ==' | base64 -d | xxd -b -c16  

Daje to:

  00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  

Teraz XOR dwa ciągi binarne:

  01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 (zwykły tekst) [XOR11000110001 110] 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110 (klucz) ----------------------------------- -------------------------------------------------- -------------------------------------------------- -------- 01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010 (tekst zaszyfrowany)  

Na koniec użyj bc, xxd i base64, aby przekonwertować binarny zaszyfrowany tekst do base64:

  echo "obase = 16; ibas e = 2; 010110011110001001011100000101001100010000111111111100111110110001000000100111111111000011010010000100011110000111111011010010 "| bc | xxd -p -r | base64  

Daje to WeJcFMQ / 8 + 8QJ / w0hHh + 0g == , czyli zaszyfrowany tekst wysłany przez OP w powyższym pytaniu.


Przepraszam, jeśli ta odpowiedź wydaje się wymyślona. Trzeba przyznać, że tak. Pytania podobne do tego, w których plakat zawiera tylko pewien zaszyfrowany tekst i prosi o wgląd w to, jak ten zaszyfrowany tekst mógł zostać wytworzony, pojawiają się dość często na security.stackexchange.com; i to pytanie jest często określane jako ich duplikat. Celem tej odpowiedzi jest zilustrowanie, że na pytania tego rodzaju nie ma odpowiedzi, ponieważ istnieje nieskończona liczba rozwiązań dla tego typu pytań.

Czekaj, więc po prostu wybrałeś hasło, wybrałeś metodę "haszowania" (XOR), a następnie brutalną siłę dla klucza, który wygenerował podany zaszyfrowany tekst?Twoje ostatnie zdanie jest złote, ale myślę, że warto je trochę bardziej podkreślić.Ktoś, kto nie zwraca uwagi, może z łatwością odejść myśląc, że „rozwiązałeś” problem.
@Conor Mancone, Dzięki za opinię.Szyfrowanie XOR można poddać inżynierii wstecznej, więc jeśli znasz 2 z 3 zmiennych (tj. Tekst jawny, klucz, tekst zaszyfrowany), możesz łatwo znaleźć trzecią.[tekst jawny xor klucz = tekst zaszyfrowany, tekst zaszyfrowany xor klucz = tekst jawny, tekst jawny xor tekst zaszyfrowany = klucz].Właśnie utworzyłem tekst jawny (P4 $$ w0rdP4 $$ w0rd), a następnie użyłem trzeciego równania powyżej, aby znaleźć klucz, który wygenerowałby tekst zaszyfrowany opublikowany przez OP, biorąc pod uwagę tekst jawny, który wybrałem.Mogłem wybrać dowolny tekst jawny.
Zastanawiałem się, czy możesz bezpośrednio rozwiązać za pomocą XOR.Nigdy nie bawiłem się szczegółowo rzeczywistymi metodami szyfrowania, więc nie byłem do końca pewien.Dzięki!


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...