这是我的代码:
#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <math.h> // this means I also need -lm at the execution of my code
int main(int argc, char *argv[])
{
if(argc != 2)
return 1;
const char salt[] = {argv[1][13], argv[1][12]}; // the value of salt is the first two chars in string argv[1], and the length of the hash is always 13
// This was const char key[9] and accounted for 8 of the errors
char key[9]; // create array of size 9 since one of the values is the null char
long long int i = 32; // initialize the incrementing variable at the lowest value printable ASCII character; long long because it's going to reach very high numbers
int j = (((i - 32))/95); // digit for key 1
int k = ((i - 32)/pow(95,2)); // digit for key 2
int l = ((i - 32)/pow(95,3)); // digit for key 3
int m = ((i - 32)/pow(95,4)); // digit for key 4
int n = ((i - 32)/pow(95,5)); // digit for key 5
int o = ((i - 32)/pow(95,6)); // digit for key 6
int p = ((i - 32)/pow(95,7)); // digit for key 7
while(i < pow(95,8) + pow(95,7) + pow(95,6) + pow(95,5) + pow(95,4) + pow(95,3) + pow(95,2) + 95) // this is inefficient but goes through every combination & string length
{
key[0] = ((i - 32) % 95) + 32;
key[1] = (j % 95) + 32;
key[3] = (k % 95) + 32;
key[4] = (l % 95) + 32;
key[5] = (m % 95) + 32;
key[6] = (n % 95) + 32;
key[7] = (o % 95) + 32;
key[8] = (p % 95) + 32;
if(char *crypt_r(const char *key, const char *salt, struct crypt_data *data) == argv[1]) // compare the hash of the current key string to the inputted hash
{
printf("%s\n", key);
return 0; //print password and exit
}
else // if the hashes don't match, then increment and try again
{
i++;
}
}
}
问题的关键在于接收使用基于DES的基于隐藏功能进行哈希处理的任何哈希密码,并使用暴力来解决问题。
问题是当我尝试编译时,我得到9个错误。我正在使用
clang -o crack crack.c -lcrypt -lm
其中八个来自key[] =
something
,他们说&#34;只读变量不可分配&#34;。
最后一个问题与&#34; if&#34;最后声明中包含char,并在char下面放一个箭头,表示&#34;期望的表达式&#34;。我在这段代码上花了好几个小时,我真的很感激它的一些帮助。
注意:我是一名学生,所以它对解释更有帮助,而不是&#34;在这里,我修复了你的代码&#34;。它也违反了这项任务的规则,我将把这个职位与我的任务联系起来,因为课程要求我认可我在课程以外的教学研究员和指导材料之外获得的任何额外帮助。
编辑:我更改了键[]并使其不是常量,这修复了8个错误。最后一个带有&#34;期望表达式&#34;仍然存在。答案 0 :(得分:1)
关于这一行:
if(char *crypt_r(const char *key, const char *salt, struct crypt_data *data) == argv[1]) // compare the hash of the current key string to the inputted hash
看起来您复制了crypt_r
的声明,而不是调用该函数。不同之处在于声明会告诉您该功能是什么,当您调用它时,您需要填写所有内容。
例如,如果你有:
char* key;
char* salt;
struct crypt_data* data;
// initialize all of those
然后你会这样称呼:
char* result = crypt_r(key, salt, data);
通常,如果您有以下形式的函数:
some_type function_name(another_type parameter_name);
然后该函数返回some_type
并期望another_type
作为第一个参数。你不需要重新宣布整件事,你只需要给它想要的两件事:
another_type x = whatever;
some_type result = function_name(x);