Откат брутфорс взломщик паролей Java
У меня есть домашнее задание, чтобы сделать рекурсивный метод взлома пароля заданной длины, n (неограниченно и неизвестно!) Из маленьких английских букв, ТОЛЬКО a-z.
Вот класс «Пароль», который создает случайный пароль:
import java.util.Random;
public class Password {
private String _password = "";
public Password(int length) {
Random generator = new Random();
for (int i = 0; i < length; ++i) {
this._password = this._password + (char) (generator.nextInt(26) + 97);
}
}
public boolean isPassword(String st) {
return st.equals(this._password);
}
public String getPassword() {
return this._password;
}
}
И вот вопрос в деталях: «Вы должны написатьстатический рекурсивный метод, public static String findPassword(Password p, int length)
это «взламывает» код. Вот пример основного метода:
public class Main {
public static void main(String[] args) {
Password p = new Password(5);
System.out.println(p.getPassword());
System.out.println(Ex14.findPassword(p, 5));
}
}
Важные заметки:
Метод ДОЛЖЕН быть рекурсивным, без использования ЛЮБЫХ циклов.Вы не можете использовать метод getPassword.Если вы хотите использовать метод класса String, вы можететолько используйте следующее: charAt, подстрока, равно, длина.Вы МОЖЕТЕ использовать перегрузку, но НЕ МОЖЕТЕ использовать другие методы. (Вы не можете использовать String.replace / String.replaceall)Вы НЕ МОЖЕТЕ использовать статические (глобальные) переменные.Вы НЕ МОЖЕТЕ использовать какой-либо массив. "Вот что у меня есть до сих пор, что явно не работает; : \ Большое спасибо! очень признателен! - TripleS
public static String findPassword(Password p, int length) {
return findPassword(p, length, "", 'a');
}
public static String findPassword(Password p, int length, String testPass, char charToChange) {
int currDig = testPass.length() - 1;
if (p.isPassword(testPass))
return testPass;
if (length == 0) // There is no password.
return ""; // Returns null and not 0 because 0 is a password.
if (length > testPass.length())
return findPassword(p, length, testPass + charToChange, charToChange);
if (testPass.length() == length) {
//TODO if charToChange is 'z', then make it the one before it '++', and reset everything else to a.
//if (charToChange == 'z') {
// charToChange = 'a';
// String newString = testPass.substring(0, currDig-1) +
// (charToChange++)
// +testPass.substring(currDig+1,testPass.length()-1);
System.out.println("it's z");
// TODO currDig --;
// String newerString = testPass.substring(0, currDig - 1)
// + (char) (testPass.charAt(testPass.length() - 1) - 25);
// currDig--;
}
return "";
}
Я думаю, что у меня есть решение, однако оно терпит неудачу с исключением в стеке, потому что стек вызовов слишком длинный. Пароли длиной 3 требуют уже более 18 тыс. Шагов, и я терплю крах около 4 тыс. (