Brute-Force-Algorithmus in C++

Lange nichts mehr gehört, oder? Dann wird es heute mal wieder Zeit. Die schriftlichen Abiturprüfungen sind gut überstanden, aber der Schulstress lässt nicht nach. Heute war der Abgabetermin für unser IT-Projekt zum Thema Kryptologie. Mein Thema war Brute Force. Genauer gesagt hatte ich die Ehre, einfach ein simples Programm schreiben zu dürfen, während andere 5-10 Seiten über irgendwelche Verschlüsselungsmethoden hinrotzen mussten.

Natürlich dachte ich sofort an euch, denn so ein Algorithmus ist einfach zu verstehen und dennoch oft nützlich. Man kann ihn nicht nur zum Knacken von irgendwelchen Passwörtern verwenden, sondern z.b. eine Hash-Tabelle erstellen oder andere nette Dinge damit anstellen.

Was ist Brute Force?

Achja, was ist Brute Force überhaupt? Ich gehe mal davon aus, dass die meisten das bereits wissen, aber für die anderen folgt hier eine kurze Erklärung. Brute Force heißt soviel wie „rohe Gewalt“ und bezeichnet schlicht das Durchprobieren aller möglichen Kombinationen eines Passworts. Nach einer gewissen Zeit wird dann das richtige Passwort gefunden und man hat im Idealfall Zugang zu einer Ressource, die geschützt ist. In der Praxis dauert das allerdings sehr lange, außerdem ist es meist so nicht möglich, da man bei guten Softwaresystemen nach 3 gescheiterten Authentifizierungsversuchen eine gewisse Zeit lang warten muss. Dadurch dauert das Knacken eines Passworts wirklich Ewigkeiten und ist extrem uneffizient.

Der Algorithmus

Eigentlich ist ja PHP die Sprache meiner Wahl. Aber Brute Force in PHP ist nicht wirklich schnell, deshalb habe ich hier auf C++ zurückgegriffen.

/**
  Simon H.
  TGI 13/1
  Brute Force
*/
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

bool go(int length, int pos, AnsiString base, TForm1* form, const char characters[80], int &done, bool show, int amount)
{
   int amount_chars = amount; //Anzahl möglicher Zeichen

   for(int i = 0; i < amount_chars-1; i++)    //Für jedes dieser Zeichen Schleifeninhalt ausführen
   {
     if(i == 0)                               //Wenn erstes Zeichen "dran" ist
     {
      base = base + characters[i];            //Dann Basisstring erweitern
     }
     else
     {
       base[pos+1] = characters[i];          //Sonst letztes Zeichen aktualisieren
     }

     if(show)                                //Fortschritt anzeigen?
     {
      form->done->Caption = done++;
      form->ProgressBar1->Position = form->done->Caption.ToInt();
      form->current_word->Caption = base;
      form->Refresh();
     }

     if(length > 1)                           //Restlänge größer 1?
     {
      if(go(length-1, pos + 1, base, form, characters, done, show, amount))      //Dann rekursion
      {
        return true;
      }
     }

     if(base == form->edit_pass->Text)
     {
       form->info->Caption = base + " wurde geknackt!";
       return true;
     }
  }
  return false;
}

void __fastcall TForm1::btn_crackClick(TObject *Sender)
{
  this->info->Caption = "Passwort wird geknackt";

  const char characters[80] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
                        'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
                        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
                        'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
                        'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2',
                        '3', '4', '5', '6', '7', '8', '9', '-', '_', ',', '%',
                        ' ', ';', '"', '\'', '?', '(', ')', '=', '$', '§', '/', '#',
                        '+', '\\' };

  int length = strlen(this->edit_pass->Text.c_str());        //Passwortlänge ermitteln

  int done = 0;

  int amount = 0;       //Anzahl der Zeichen aus Auflistung oben, die benutzt werden sollen

  switch(this->charset->ItemIndex)
  {
     case 0:  amount = 52; break;
     case 1:  amount = 62; break;
     case 2:
     default: amount = 80; break;
  }

  this->possibilities->Caption = pow(amount, length);

  this->ProgressBar1->Max = this->possibilities->Caption.ToInt();

  DWORD tick = GetTickCount();       //Zum Ermitteln der Laufzeit

  if(!go(length, 0, "", this, characters, done, !this->fast->Checked, amount)) //Knacken starten und Ergebnis auswerten
  {
     this->info->Caption = "Knacken fehlgeschlagen";
  }

  AnsiString test =   ((float)GetTickCount()-(float)tick)/1000;    //Dauer berechnen

  MessageBox(NULL, test.c_str() , "Dauer in Sekunden", MB_OK);     //Dauer ausgeben
}

Eigentlich ist nur die Methode go() interessant für Brute Force an sich. Die andere Methode reagiert nur auf einen Tastenklick auf der Oberfläche und stoßt das Passwort-Knacken an. go() arbeitet – wie man sieht – rekursiv und baut sich so das Passwort in mehreren Ebenen zusammen. Ich denke, dass der Code mehr als tausend Worte sagt, oder?

Man muss beachten, dass der Code in dieser Form nur Passwörter mit einer Länge von 4 Zeichen unterstützt. Das liegt daran, dass es eine ProgressBar gibt, die den Fortschritt anzeigt. Da diese nur Int-Werte als Maximalwerte annimmt, ist irgendwann der Maximale Int-Wert erreicht. Und das ist bei 5 Zeichen Länge der Fall.

1 Star2 Stars3 Stars4 Stars5 Stars (3 Stimme, durchschnittlich 4,67 / 5)
Loading...


6 Kommentare zu “Brute-Force-Algorithmus in C++”

  1. Sowas selbst zu programmieren macht sowieso wenig Sinn(siehe CUDA).
    Aber gut geeignet, um die Funktionsweise zu verdeutlichen, was hier auch das Ziel gewesen ist ;).
    .-= Thomas´s last blog ..Quellangabe bei Kopien =-.

  2. […] sehr anbieten, da die Schritte ja immer gleich sind.. Kuck dir mal das als Orientierungshilfe an: Brute-Force-Algorithmus in C++ Mit ein bisschen rumprobieren wirds ziemlich einfach. Hier mal ein Halb-Pseudocode von mir (ich […]

  3. Wie schnell ist dein Algorithmus, wie viele Keys pro Sekunde ?

  4. Darum ging es nicht. Das habe ich also nicht getestet. Außerdem wäre die Angabe sowieso von einem bestimmten Rechner (CPU, RAM) abhängig. Von daher kann ich dir da leider keine Antwort geben!

  5. wo deffniert mann Tform?

  6. Keine Ahnung, ist schon zu lange her. Sorry!

Hinterlasse einen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

»Informationen zum Artikel

Autor: Simon
Datum: 04.05.2010
Zeit: 19:23 Uhr
Kategorien: C/C++
Gelesen: 16018x heute: 2x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta