Dictionnary Attack有时会在C中返回错误的密码

时间:2015-06-18 00:54:54

标签: c encryption

我正在尝试构建一个程序,该程序使用字典攻击来破解使用DES加密的密码(练习课程)。 我通过加密使用crypt()函数加密我在已使用的字典中的单词来测试它。

有时候它会起作用,有时它会在正确的值之上或之下返回值,有时则不返回任何值。 即试图破解非正交性的散列返回非正交(正好在它之上),试图破解aba的散列不返回任何东西。其他一些词起作用(请记住,所有这些词肯定都在我使用的词典中。

#define _XOPEN_SOURCE
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <string.h>

char salt[2];

int checker();

int main(int argc, char* argv[])
{   
    //returns an error and exit if no or more than 1 hash was entered
    if(argc != 2)
    {
        printf("You must enter one password\n");
        return 1;


    }

    //Extracts the salt from the entered hashed password
    strncpy(salt, argv[1], 3);
    salt[2] = '\0';

    //opens the dictionnary file and gets it line by line
    FILE *dictionnary = fopen ("/Path/To/Dictionary.txt", "rt");
    char buf[256];
    printf("Using Dictionnary\n");
    while (fgets (buf, sizeof(buf), dictionnary)) 
    {   
        if(checker(argv[1], buf)==0)
            break;

    }


    return 0;
}

//takes the value of the password taken from the dictionnary, hashes it and compares it to the entered hash. Prints the unhashed password if they're the same


 int checker(char hash[], char* tocheck)
{
tocheck[strcspn ( tocheck, "\n" )] = '\0';
char* passwd = crypt(tocheck, salt);
if (strcmp(hash, passwd) == 0)
{

    printf("The password is %s\n", tocheck);
    return 0;       
}


else
    return 1;

}

我在删除break语句后尝试了它,它现在返回错误的密码和正确位于其下方的正确密码(即非正交和非正交),但它是仍然没有与其他一些合作。 谁能帮我弄清楚我做错了什么?

编辑:经过调试器后,我想通了。我正在将新行字符转换为散列上的空字符,而不是我从文件中获取的值。这没用。有效的新固定代码。 谢谢大家的帮助

1 个答案:

答案 0 :(得分:0)

来自crypt()的手册页:

  

取前八个字符中每个字符的最低7位          密钥,获得56位密钥。这个56位密钥用于          重复加密一个常量字符串(通常是一个字符串组成的          全零。)

底线:只有密钥的前8个字节对crypt()很重要。如果你的词典包含(非)单词“nonortho”,那么你的程序也应该将它与“nonorthorthogonality”的加密版本相匹配。

至于破解密码的失败,你认为你应该能够破解,请注意@ AndrewMedico关于什么函数checker()(未能)在未成功匹配的情况下返回的评论。尽管不匹配,它有时会返回0,这是完全合理的。