我正在尝试构建一个程序,该程序使用字典攻击来破解使用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语句后尝试了它,它现在返回错误的密码和正确位于其下方的正确密码(即非正交和非正交),但它是仍然没有与其他一些合作。 谁能帮我弄清楚我做错了什么?
编辑:经过调试器后,我想通了。我正在将新行字符转换为散列上的空字符,而不是我从文件中获取的值。这没用。有效的新固定代码。 谢谢大家的帮助
答案 0 :(得分:0)
来自crypt()
的手册页:
取前八个字符中每个字符的最低7位 密钥,获得56位密钥。这个56位密钥用于 重复加密一个常量字符串(通常是一个字符串组成的 全零。)
底线:只有密钥的前8个字节对crypt()
很重要。如果你的词典包含(非)单词“nonortho”,那么你的程序也应该将它与“nonorthorthogonality”的加密版本相匹配。
至于破解密码的失败,你认为你应该能够破解,请注意@ AndrewMedico关于什么函数checker()
(未能)在未成功匹配的情况下返回的评论。尽管不匹配,它有时会返回0
,这是完全合理的。