C:比较哈希值似乎消失了

时间:2017-06-12 19:02:48

标签: c

对于对神圣代码的热爱,我试图比较哈希以找到正确的密码。我被赋予一个哈希作为一个命令行参数,然后我哈希来自" a"到" ZZZZ"直到其中一个哈希对匹配。

void decipher(string hash)
{
    //Set the password, and the salt.
    char pass[4] = "a";
    char salt[] ="50";

    //Compare the crypted pass againts the hash until found. 
    while (strcmp(hash,crypt(pass, salt)) != 0)
    {
        //Use int i to hold position, and return next char
          int i = 0;
          pass[i] = get_next(pass[i]);
          tick_over (pass, i);

          //Hardcode in a fail safe max length: exit.
          if (strlen(pass) > 4)
            {
               break;
            }
    }
    printf("%s\n", pass);
}

问题在于它不会“抓住”。正确的密码/比较,当密码长4个字母时。它适用于1,2和3个字母长的单词。

//Tick over casino style
string tick_over (string pass, int i)
{
    //Once a char reaches 'Z', move the next char in line up one value.
    char a[] = "a";
    if (pass[i] == 'Z')
    {
      if (strlen(pass) < i+2)
      {
        strncat (pass, &a[0], 1);
        return pass;
      }
      pass[i+1] = get_next(pass[i+1]);
      //Recursively run again, moving along the string as necessary
      tick_over (pass, i+1);
    }
    return pass;
}

//Give the next character in the sequence of available characters 
char get_next (char y)
{
    if (y == 'z')
    {
        return 'A';
    }
    else if (y == 'Z')
    {
        return 'a';
    }
    else 
    {
        return y + 1;
    }
}

它会迭代正确的单词,正如我在调试中发现的那样。我试过移动

strcmp(hash, crypt(pass, salt)) == 0

进入嵌套的if语句等等,但它似乎不是问题所在。是某种方式忘记&#39;命令行值?调试哈希值时似乎已经消失了:/请帮忙!

2 个答案:

答案 0 :(得分:2)

char pass[4] = "a";你要定义一个char数组,最多可以包含3个字符+空终止符。

与您的“安全”测试不一致:if (strlen(pass) > 4)

strlen为4时,由于空终止char:未定义的行为,数组已经覆盖了内存中的某些内容。

快速修正:char pass[5] ...

答案 1 :(得分:0)

以下是函数strncat的解释:

  

从字符串追加字符   将源的前num个字符追加到目标,加上终止的空字符

如果

大小为4,则不考虑四个字符数组的终止空字符。