总是返回相同的值,但不应

时间:2019-02-12 07:38:56

标签: c#

每次我在gui中运行我的代码时,它都会根据输入的字符数返回值...因此,例如,如果我使用1个字符,无论哪一个字符总是返回69,如果它的2个字符始终返回4830这不是应该的...因为根据使用的字符而进行的尝试次数会有所不同。

static void Recurse(int Lenght, int Position, string BaseString, ref int Combi, ref int Characters, ref string FindPassword)
{
    //Character libary
    char[] Match =                 
{'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','!','?',' ','*','-               
','+','#','_',};
    int Count = 0;

    for (Count = 0; Count < Match.Length; Count++)
    {
        Combi++;
        if (Position < Lenght - 1)
        {
            Recurse(Lenght, Position + 1, BaseString + Match[Count], ref Combi, ref Characters, ref FindPassword);
        }
        if (BaseString + Match[Count] == FindPassword)
        {

        }
    }
}

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
    Main f2 = new Main();
    f2.ShowDialog();
    this.Show();
}

private void Txt_Password_TextChanged(object sender, EventArgs e)
{
    Btn_Bruteforcer_Start.Enabled = true;
}

private void Chb_Showpassword_CheckedChanged(object sender, EventArgs e)
{
    if(Chb_Showpassword.Checked)
    {
        Txt_Password.UseSystemPasswordChar = false;
    }
    else
    {
        Txt_Password.UseSystemPasswordChar = true;
    }
}

private void Btn_Bruteforcer_Start_Click(object sender, EventArgs e)
{
    string FindPassword = "";
    int Combi = 0;
    int Characters;
    FindPassword = Txt_Password.Text;

    Characters = FindPassword.Length;
    Recurse(FindPassword.Length, 0, "", ref Combi, ref Characters, ref FindPassword);
    Password_Tester DataDisplay = new Password_Tester(FindPassword, Combi, Characters);
    DataDisplay.ShowDialog();
    Console.WriteLine();            
}

我希望它返回尝试过的结果。例如,input = 0将花费1次尝试而不是69次,因为它现在显示...我使它工作更早了,但是由于某种原因我无法找到问题

1 个答案:

答案 0 :(得分:0)

您的程序有很多问题...

首先,您应该关注代码的标识。如果标识不明确,则很难调试。

因此,您始终会得到相同的输出,因为您仅使用字符数作为实参。请注意,您不会对此if语句做任何事情:

if (BaseString + Match[Count] == FindPassword)
{

}

您必须使用停止条件,因为如果可能,一个布尔标志会确认您已找到它,因此您不应再尝试了。另外,从我的角度来看,您错误地计算了组合的数量。由于您已经知道密码中的字符数,因此只有在达到该长度时才应增加组合数。同样,我不确定您是否只想计算“有效尝试”(长度相同)。关于您的问题,我将添加一个额外的参数:

static void Recurse(int Lenght, int Position, string BaseString, ref      

int Combi,ref int字符,ref字符串FindPassword,ref布尔hasFoundPassword)

那你就可以做

 if (BaseString + Match[Count] == FindPassword)
 {
     hasFoundPassword = true;
 }

您只需在找不到密码的情况下尝试一下:

for (Count = 0; Count < Match.Length; Count++)
{
    if(hasFoundPassword) return;