Test-Brutforce-Funktion bauen
-
Hi,
ich versuche mir gerade eine Brutforce-Funktion zu bauen, bekomme es aber nicht hin!
std::string bruteforce(std::string& md5sum, int maxdepth = 5, int curdepth = 0, std::string curs = "") { for(char c = 'a'; c != 'Z'; ++c) { if(md5::encode(curs) == md5sum) return curs; curs += c; if(curdepth != maxdepth) { ++curdepth; curs = bruteforce(md5sum, maxdepth, curdepth, curs); //--curdepth; } curs.erase(curs.end()-1); } return curs; }Ich weiß, dass es falsch ist. Auch ungefähr warum, aber nicht, wie man es richtig machen könnte!
Mal an einem Beispiel, bei einer Tiefe von 3:
Zuerst betritt man die Rekursion bis zur maximalen Tiefe:
aaaDanach wird erst die Schleife einmal durchgelaufen:
aab
aac
aad
...
aaZWeils aber noch nicht stimmt, wird jetzt die unterste Rekursionstiefe verlassen:
ab
ac
ad
...Das ist also schonmal klar falsch. Wie geht es richtig?? Wenn ich die Tiefe wieder runterzähle, springt er mir jedes mal wieder eine Stufe tiefer und kommt da nicht mehr raus. Ist gewissermaßen eine Endlosschleife, wenn ich das so alles richtig verstehe.
-
#include <string> #include <vector> //#include <iostream> bool bruteforce (std::string& md5sum, const std::vector <char> &character, std::string &curs "", const size_t &maxdepth = 5, const size_t &curdepth = 1) { if (md5::encode ("") == md5sum) //kA, ob das geht - aber ich vermute mal schon ^^ { curs = ""; return true; } curs = bf (md5sum, character, curs, maxdepth, curdepth); if (!curs.empty ()) return true; return false; } std::string bf (const std::string& md5sum, const std::vector <char> &character, const std::string &curs, const size_t &maxdepth, const size_t &curdepth) { std::vector <char>::const_iterator end (character.end ()); for (std::vector <char>::const_iterator iter (character.begin ()); iter != end; ++iter) { //std::cout << curs + *iter << std::endl; if(md5::encode(curs + *iter) == md5sum) return (curs + *iter); if (curdepth != maxdepth) { std::string R (bf (md5sum, character, curs + *iter, maxdepth, curdepth+1)); if (!R.empty ()) return R; } } return ""; }#include "meinquickanddirtybfalgo.hpp" #include <iostream> int main (int argc, char *argv[]) { std::vector <char> ch; for (char ToAdd ('0'); ToAdd != '9'; ++ToAdd) ch.push_back (ToAdd); for (char ToAdd ('a'); ToAdd != 'z'; ++ToAdd) ch.push_back (ToAdd); for (char ToAdd ('A'); ToAdd != 'Z'; ++ToAdd) ch.push_back (ToAdd); ch.push_back ('_'); ch.push_back ('!'); ch.push_back ('$'); ch.push_back ('&'); ch.push_back ('/'); ch.push_back ('('); ch.push_back (')'); ch.push_back ('='); ch.push_back ('?'); ch.push_back ('+'); ch.push_back ('*'); ch.push_back ('#'); ch.push_back ('.'); ch.push_back (','); std::string md5hash (""); std::cin >> md5hash; std::string ergebnis (""); if (bruteforce (md5hash, ch, ergebnis)) std::cout << "Ergebnis (\"" << md5hash << "\"):\t" << ergebnis << std::endl; return 0; }Also ich finds fast schön ^^
bb und gn8 ; )
-
sry für doppelpost aber so richtig gefallen hats mir dann doch noch nicht deshalb hab ich mirs noch ma angeguckt und das daraus gemacht:
#ifndef MY_BRUTEFORCE_DEF #define MY_BRUTEFORCE_DEF #include <iostream> #include <iterator> #include <string> #include <vector> namespace BruteForce { static const int FAIL (-1); }; template <class CryptClass> //std::string CryptClass::EnCode (std::string) class TBruteForce_Depth { private: std::string m_Hash; std::string m_Ergebnis; std::vector <char> Characters; std::vector <char>::const_iterator Characters_first; std::vector <char>::const_iterator Characters_end; size_t m_Depth; bool CanPrint; bool doing (const std::string &curr) { if (CryptClass::EnCode (curr) == m_Hash) { m_Ergebnis = curr; return true; } else if (curr.length () < m_Depth) { for (std::vector <char>::const_iterator iter (Characters_first); iter != Characters_end; ++iter) { if (doing (curr + *iter)) return true; } } return false; } public: TBruteForce_Depth (const std::string &hash = "", bool allowedtoprint = false) : m_Hash (hash), Characters (0), CanPrint (allowedtoprint) {}; void SetHash (const std::string &hash) {m_Hash = hash;}; std::string GetHash (void) const {return m_Hash;}; void SetDepth (const size_t &depth) {m_Depth = depth;}; std::string GetErgebnis (void) const {return m_Ergebnis;}; void SetVector (const std::vector <char> &newvector) {Characters = newvector;}; void AddCharacter (const char toadd) {Characters.push_back (toadd);}; bool CheckCharacter (const char toproof) const { for (std::vector <char>::const_iterator iter (Characters.begin ()); iter != Characters.end (); ++iter) { if (*iter == toproof) return true; } return false; }; void AddCharacters (const std::string &ToAdd) { for (std::string::const_iterator iter (ToAdd.begin ()); iter != ToAdd.end (); ++iter) { if (CheckCharacter (*iter)) continue; Characters.push_back (*iter); } }; void Do (void) throw (...) { if (CanPrint) { if (m_Hash.empty ()) std::clog << "warning: there isnt set a hash!" << std::endl; if (Characters.empty ()) std::clog << "warning: there isnt set any character!" << std::endl; if (!m_Depth) std::clog << "warning: depth is zero!" << std::endl; } Characters_end = Characters.end (); Characters_first = Characters.begin (); std::string first (""); if (!doing (first)) throw BruteForce::FAIL; }; }; #endif //#ifndef MY_BRUTEFORCE_DEFclass dummy { public: static std::string EnCode (const std::string &tocrypt) { return tocrypt; }; }; int main (int argc, char *argv[]) { std::string md5hash (""); std::cout << "Geben Sie den Hash ein:" << std::endl; std::getline (std::cin, md5hash); TBruteForce_Depth <dummy> forcingclass (md5hash); std::cout << "Geben Sie alle zu nutzenden Zeichen ein:" << std::endl; std::string chars (""); std::getline (std::cin, chars); forcingclass.AddCharacters (chars); int dpth (5); std::cout << "Geben Sie die Laenge ein:" << std::endl; std::cin >> dpth; forcingclass.SetDepth (dpth); try { forcingclass.Do (); std::cout << "Ergebnis (\"" << forcingclass.GetHash () << "\"):\t" << forcingclass.GetErgebnis () << std::endl; } catch (int err) { if (err == BruteForce::FAIL) std::cout << "Es konnte kein Ergebnis gefunden werden"; } return 0; }So schaff ich > 3Millionen Versuche pro CPU-Sekunde bei einer 2GHz CPU.
Was du noch machen könntest:
- Das ganze in einen Thread auslagern
- Aus Template-Argument statt der Klasse direkt die encode-fkt zu übergeben-war ich dann aber zu faul ^^Ich hoffe, dir bringts was - machs gut

bb Tom