Passwort Brute Force rekursiv

Hallo,

ich bin 17 Jahre alt und überlege mir, Info zu studieren. An meiner Schule konnte ich aber kein Info in der Oberstufe nehmen und programmiere deswegen in meiner Freizeit ein bisschen.

Folgendes Problem: Ein Passwort (klein und Großbuchstaben und zahlen) mit bruteforce zu knacken. Ich habe es jetzt Mal bis zu einer länge von dem Passwort von 5 Buchstaben/zahlen programmiert. Für 5 braucht mein PC auch schon sehr lange.

Aber ich möchte gerne wissen, ob ich es nicht auch rekursiv programmieren kann, damit die Passwortlänge theoretisch unbegrenzt lange sein kann (auch wenn mir klar ist, dass es sehr lange dauern würde)

Java:
public class Passwort
{
    private String passwort;
    private String werte[];
    
    public Passwort(String passwort){
    werte=new String[62];
    setPasswort(passwort);
    arrayFuellen();
    }
    
    public void setPasswort(String passwort){
    this.passwort=passwort;
    }
    
    private boolean istGleichPasswort(String passwort){
    return this.passwort.equals(passwort);
    }
    
    private void arrayFuellen(){
    
        for(int i=0; i<10; i++){
        werte[i]=Integer.toString(i);
        }
        
        for (int i=10; i<36; i++){
        werte[i] = Character.toString((char)i+55);
        }
        
        for (int i=36; i<62; i++){
        werte[i] = Character.toString((char)i+61);
        }
    }
    
    
    
    public String suchePasswort(int stellen){
        arrayFuellen();
        String passwort;
        
        for(int i=0; i<werte.length; i++){
        passwort = werte[i];
        System.out.println(passwort);
        if(istGleichPasswort(passwort)){return passwort;}
        }
        
        for(int i=0; i<werte.length; i++){
        passwort = werte[i];
            for (int j=0; j<werte.length; j++){
                passwort= passwort + werte [j];
                System.out.println(passwort);
                if(istGleichPasswort(passwort)){return passwort;}else{passwort = werte[i];}
            }
        }
        
            
            for(int i=0; i<werte.length; i++){
            passwort = werte[i];
                for (int j=0; j<werte.length; j++){
                passwort= werte[i] + werte [j];
                    for(int k=0; k<werte.length; k++){
                        passwort=passwort + werte[k];
                        System.out.println(passwort);
                        if(istGleichPasswort(passwort)){return passwort;}else{passwort = werte[i] + werte [j];}
                    }               
            }
        }
            
            for(int i=0; i<werte.length; i++){
            passwort = werte[i];
                for (int j=0; j<werte.length; j++){
                passwort= werte[i] + werte [j];
                    for(int k=0; k<werte.length; k++){
                        passwort=werte[i] + werte[j] + werte[k];
                            for(int l =0; l<werte.length; l++){
                                passwort=passwort + werte[l];
                                System.out.println(passwort);
                                if(istGleichPasswort(passwort)){return passwort;}else{passwort = werte[i] + werte [j] + werte [k];}
                                
                            }
                    }
                        
                }               
            }
            
            for(int i=0; i<werte.length; i++){
            passwort = werte[i];
                for (int j=0; j<werte.length; j++){
                passwort= werte[i] + werte [j];
                    for(int k=0; k<werte.length; k++){
                        passwort=werte[i] + werte[j] + werte[k];
                            for(int l =0; l<werte.length; l++){
                                passwort=werte[i]+ werte[j]+ werte[k]+werte[l];
                                for(int m=0; m<werte.length; m++){
                                passwort=passwort + werte[m];
                                System.out.println(passwort);
                                if(istGleichPasswort(passwort)){return passwort;}else{passwort = werte[i] + werte [j] + werte [k] + werte[l];}
                                }
                            }
                                
                                
                    }
                }
                        
            }   
            return null;
    }
}


Könnt ihr mir da bitte Helfen? Viele Grüße
 

Robert Zenz

Top Contributor
Aber ich möchte gerne wissen, ob ich es nicht auch rekursiv programmieren kann, damit die Passwortlänge theoretisch unbegrenzt lange sein kann
Nein, rekursiv und unendlich geht fix nicht, weil dir irgendwann der Stapel ausgehen wird (lange vor dem restlichen Speicher bei einer normalen Schleife).

Jeder Methodenaufruf kommt auf den Stapel, und der Stapel ist im Vergleich zum restlichen Speicher sehr begrenzt. Rekursiv macht in kaum einem Kontext wirklich Sinn, insbesondere dann nicht wenn du eine grosze Tiefe zu erwarten hast.
 

Robert Zenz

Top Contributor
Du musst deine Logik auf zwei Schleifen umbauen um beliebig lange Passworte zu unterstuetzen, das hat dann aber nichts mit rekursiv zu tun.
 
Nein, rekursiv und unendlich geht fix nicht, weil dir irgendwann der Stapel ausgehen wird (lange vor dem restlichen Speicher bei einer normalen Schleife).

Jeder Methodenaufruf kommt auf den Stapel, und der Stapel ist im Vergleich zum restlichen Speicher sehr begrenzt. Rekursiv macht in kaum einem Kontext wirklich Sinn, insbesondere dann nicht wenn du eine grosze Tiefe zu erwarten hast.
Du musst deine Logik auf zwei Schleifen umbauen um beliebig lange Passworte zu unterstuetzen, das hat dann aber nichts mit rekursiv zu tun.

Ist Rekursiv hier auch theoretisch nicht möglich? Also auch nicht bis zB Länge 9 und nur zur Vereinfachung und Strahlung des Codes? Weil ich habe Mal gehört, wenn man viel copy and paste braucht und immer wieder das gleiche wo reinkopiert, würde rekursiv nahe liegen.

Und wie würde das mit zwei schleifen dann aussehen?
 

Robert Zenz

Top Contributor
Ist Rekursiv hier auch theoretisch nicht möglich?
Theoretisch ja, praktisch macht es aber keinen Sinn. Die klassische Loesung mit rekursiv in dem Fall waere ja das du fuer jede Permutation einen Methodenaufruf hast, aber damit kommst du eben nicht weit weil dir der Stapel ausgeht.

Weil ich habe Mal gehört, wenn man viel copy and paste braucht und immer wieder das gleiche wo reinkopiert, würde rekursiv nahe liegen.
Nein, da liegt entweder eine Schleife oder eine Methode nahe, um das was man immer wieder macht einfach den Computer immer wieder machen zu lassen.

Und wie würde das mit zwei schleifen dann aussehen?
Sorry, das muss dir gerade jemand anderes zeigen, ich bin gerade zu blank im Kopf fuer tatsaechlichen Code (g'scheit daherred'n geht aber immer).
 
Theoretisch ja, praktisch macht es aber keinen Sinn. Die klassische Loesung mit rekursiv in dem Fall waere ja das du fuer jede Permutation einen Methodenaufruf hast, aber damit kommst du eben nicht weit weil dir der Stapel ausgeht.


Nein, da liegt entweder eine Schleife oder eine Methode nahe, um das was man immer wieder macht einfach den Computer immer wieder machen zu lassen.


Sorry, das muss dir gerade jemand anderes zeigen, ich bin gerade zu blank im Kopf fuer tatsaechlichen Code (g'scheit daherred'n geht aber immer).
OK danke für deine Antworten. Wenn noch jemand anderes hier ist, mich würden sowohl die theoretische rekursive Lösung als auch die zwei schleifen Lösung interessieren.
 

httpdigest

Top Contributor
Eine eine (iterative) Lösung für (theoretisch) beliebig lange Strings (in der Implementierung unten aber nur bis Länge 10) mit zwei Schleifen wäre:
Java:
import java.util.Optional;
import java.util.function.Predicate;
public class BruteForce {
  private static final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  public static Optional<String> findPassword(Predicate<String> tester) {
    long n = 0L;
    char[] password = new char[10];
    while (true) {
      int len = 0;
      for (long v = n; v != 0L; v /= CHARS.length())
        password[len++] = CHARS.charAt((int) (v % CHARS.length()));
      if (tester.test(new String(password, 0, len)))
        return Optional.of(new String(password, 0, len));
      n++;
    }
  }

  // Test
  public static void main(String[] args) {
    String correctPassword = "te5t";
    System.out.println(findPassword(correctPassword::equals));
  }
}
 

berndoa

Top Contributor
Nicht zwingend die schönste, effizienteste oder schnellste Methode aber wie bei einem Stellenwertsystem könnte man auch ein String Array bestimmter Länge haben, dieses zuerst auf den "kleisntmöglichen" Wert setzen (bspw. {a,a,a,a,a}) und dann in jedem Schritt "eins hoch zählen.
wenn deine möglichen Zeichen also bspw. von a-z gehen , würdest du zählen:
{a,a,a,a,a}
{a,a,a,a,b}
{a,a,a,a,c}
.....
{a,a,a,a,z}
{a,a,a,b,a}
{a,a,a,b,b}
{a,a,a,b,c}
immer weiter bis
{z,z,z,z,z}

Die methode zum "um eins erhöhen" lässt sich durchaus programmieren.
habe sowas shcon mal mit zahlen 0-49 durchgespielt, insofenr sollte das mit etwas Abwandlung auch mit Buchstaben oder so gehen :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L 4 stelliges Passwort aus bestimmten Zeichen. Java Basics - Anfänger-Themen 27
M Passwort erraten Java Basics - Anfänger-Themen 1
A Passwort erstellen Java Basics - Anfänger-Themen 3
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
JavaBeginner22 Passwort Generator Java Basics - Anfänger-Themen 2
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
C Passwort abprüfen Java Basics - Anfänger-Themen 5
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
cpt.Tomato Scanner problem mit Passwort Login Java Basics - Anfänger-Themen 3
B Email versand - aber akzeptiert auch falscher Username und Passwort??? Java Basics - Anfänger-Themen 1
N Passwort Anfrage vor Programm start Java Basics - Anfänger-Themen 1
K Methoden Passwort Bestätigungsfeld mit Password vergleichen Java Basics - Anfänger-Themen 7
A Passwort System Java Basics - Anfänger-Themen 4
G Passwort und Passwort wiederholen in if-Abfrage vergleichen Java Basics - Anfänger-Themen 15
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
J Passwort überprüfen Java Basics - Anfänger-Themen 3
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
C Encrypted (passwort) Rar Datei entpacken Java Basics - Anfänger-Themen 42
Detox Passwort verschleiern Java Basics - Anfänger-Themen 4
A Erste Schritte Passwort an "Internetseite" übergeben. Java Basics - Anfänger-Themen 2
B Passwort zurücksetzen Java Basics - Anfänger-Themen 1
U Passwort verschlüsseln schlägt fehl Java Basics - Anfänger-Themen 3
T Passwort Generator Java Basics - Anfänger-Themen 2
B If Abfrage mit Passwort und Username Java Basics - Anfänger-Themen 2
fLooojava Passwort generieren - kleines Programm Java Basics - Anfänger-Themen 15
Z User/passwort eingabe...Help! Java Basics - Anfänger-Themen 4
M Passwort-Generator Java Basics - Anfänger-Themen 3
S Passwort Manager Java Basics - Anfänger-Themen 2
J Passwort Java Basics - Anfänger-Themen 4
A Passwort Schutz Java Basics - Anfänger-Themen 8
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
P Passwort Abfrage Java Basics - Anfänger-Themen 3
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
c_sidi90 Passwort Generator Code Erweiterung Java Basics - Anfänger-Themen 12
K Methode Passwort generieren Java Basics - Anfänger-Themen 10
F OOP Textdatei zippen und mit Passwort sichern Java Basics - Anfänger-Themen 5
Benji0815 Java Passwort in Formular eingeben Java Basics - Anfänger-Themen 5
G Passwort verschluesselt speichern Java Basics - Anfänger-Themen 7
M Regular Expression - Passwort - aufeinanderfolgende Zeichen Java Basics - Anfänger-Themen 3
H Passwort einlesen funktioniert nicht wie gewünscht Java Basics - Anfänger-Themen 5
S Erster Versuch: Passwort erstellen Java Basics - Anfänger-Themen 3
S String Vergleich mit Passwort geht nur bei Zahlen ? Java Basics - Anfänger-Themen 7
S Vergleichen von verschlüsselten Passwort Java Basics - Anfänger-Themen 3
G Passwort vor unbefugtem Zugriff schützen Java Basics - Anfänger-Themen 7
D Passwort verschlüsseln mit MD5 Java Basics - Anfänger-Themen 30
P Passwort überprüfen mit regular Expression Java Basics - Anfänger-Themen 4
O Unsichtbares Passwort Java Basics - Anfänger-Themen 2
R Passwort Maskierung in der Konsole Java Basics - Anfänger-Themen 9
I Frame mit Passwort-Eingabe (Datenbank) Java Basics - Anfänger-Themen 6
V Passwort-String byteweise in eine Datei schreiben Java Basics - Anfänger-Themen 6
T Passwort nicht in URL übergeben Java Basics - Anfänger-Themen 5
B Benutzername und Passwort an Internetseite übergeben Java Basics - Anfänger-Themen 3
B Passwort generator Java Basics - Anfänger-Themen 7
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
K Erste Schritte Brute Force Algorithmus Java Basics - Anfänger-Themen 2
S Distanzen mit Brute Force Java Basics - Anfänger-Themen 27
U Spielfelde erstellen & via Brute-Force jedes Feld aktivieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben