Я создаю алгоритм грубой силы (в образовательных целях) на C # и обнаружил ошибку.
Мой способ грубой силы подобен часам - последний символ в строке повышается с 0 до последнего символа в массиве символов, заданном в начале программы, когда он достигает конца - сбрасывается в 0 и увеличивает предыдущий символ на 1 и т. д.
Тем не менее, код ниже печатает только 0:
// Array with characters to use in Brute Force Algorithm.
// You can remove or add more characters in this array.
private static char[] fCharList =
{
'0','1','2','3','4','5','6','7','8','9','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','C','L','M','N','O','P',
'Q','R','S','T','U','V','X','Y','Z','~','!','@','#','$','%','^','&','*','(',')','[',']','{','}','.',',','/','?','\'','|','"',';',':','<','>','\\','=','-','+','`','_'
};
private static String password;
static void Main(string[] args)
{
Console.WriteLine("Enter the password: ");
password = Console.ReadLine();
Bruteforce();
}
// The Bruteforce algorithm
// Goes like a clock cycle: Last index goes from fCharList[0] to fCharList[fCharList.Length - 1]
// then resets and last index -1 increases and so on.
public static String Bruteforce()
{
String currPass = fCharList[0].ToString();
bool foundPass = false;
for (int i = 1; !foundPass; i++)
{
// If there's a need to increase (foundd fCharList[fCharList.Length - 1] in the String)
if (currPass.Contains(fCharList[fCharList.Length - 1]))
{
//If no need to increase the whole length and reset all the characters
if (!(currPass.IndexOf(fCharList[fCharList.Length - 1]) == 0))
{
String updateCurrPass = "";
for (int j = currPass.Length - 1; j >= currPass.IndexOf(fCharList[fCharList.Length - 1]); j--)
{
updateCurrPass += fCharList[0].ToString();
}
currPass.Insert(currPass.IndexOf(fCharList[fCharList.Length - 1]) - 1, fCharList[Array.IndexOf(fCharList, currPass.ElementAt<char>(currPass.IndexOf(fCharList[fCharList.Length - 1]) - 1)) + 1].ToString() + updateCurrPass);
}
}
else // If no cycle ended - continue increasing last "digit"
{
currPass.Insert(currPass.Length - 1, fCharList[Array.IndexOf(fCharList, currPass.ElementAt(currPass.Length - 1)) + 1].ToString());
}
Console.Write(currPass + " ");
}
return "";
}
Я перепробовал все возможные проблемы с currPass.Insert(currPass.Length - 1, fCharList[Array.IndexOf(fCharList, currPass.ElementAt(currPass.Length - 1)) + 1].ToString());
(так как подозревал, что проблема может возникнуть в самом процессе печати), но безуспешно.
Я также пытался отследить код, используя точки останова и бумагу, но ничего не вышло.
Было бы очень приятно, если бы кто-нибудь помог мне решить эту проблему.
Изменить:
Ниже многие предположили, что updateCurrPass += fCharList[0].ToString();
должно быть updateCurrPass += fCharList[j].ToString();
. Я еще не проверил эту опцию слишком глубоко, но чтобы лучше объяснить мою ситуацию, я хочу, чтобы она работала как тактовый цикл - когда последняя цифра является последним символом в fCharList
, предыдущая цифра увеличивается и так далее. Упомянутый код сбрасывает цифры, которые достигли последнего символа. (Таким образом, если строка currPass была "0aa___"
(_ является последним символом), она станет 0ab000
) updateCurrPass
добавляет 3 0, в то время как остальная часть функции увеличивает a до b.