gpt4 book ai didi

c - 像这样初始化一个数组 pass2[2] ="aa";不起作用

转载 作者:行者123 更新时间:2023-11-30 19:08:27 25 4
gpt4 key购买 nike

我正在做一项作业,其中我必须破解基于 DES 的散列密码。用户在命令行参数中输入哈希密码;我散列每种可能性(假设salt是50,pass是不超过4个字符并且字符可以是abc...xyz和ABC...XYZ );当我的哈希值与命令行中的哈希值相等时,我会打印未哈希值的密码。

使用 1 个字符长的密码一切正常,但使用 2 个字符长的密码时遇到一些问题。 我希望这个问题简短一些,不要让你不知所措,所以如果你想看的话,我会在最后发布我的整个代码

所以,我有这一行,其中包含密码可能包含的字符:

string options="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

然后我构建可能的密码。我从选项中取出第一个字符并将其存储在变量 pass2 的位置 [0] 中(此时,pass2='a')。然后,我对位置 [1] 执行与选项相同的次数(存储 pass2 的第二个值 --> pass2='aa'..'aZ')。如果这些选项都不是我要查找的密码,我会再次继续使用第一个字符 (pass2='bZ') 并继续尝试位置 [1] 的不同选项 (pass2='ba') ... 等等。代码:

char pass2[0][1] = "aa";
for (int j=0, n=strlen(options); j<n; j++)
{
pass2[0]=options[j];
for (int i=0; i<n; i++)
{
pass2[1]=options[i];
string hash2=crypt(pass2, "50");
if (memcmp(hash2, argv[1], 13)==0)
{
printf("%s\n", pass2);
}
}
}

通过上面的代码,我希望我的程序采用变量 pass2并存储以下内容:aa、ab、ac、...、aX、aY、aZ、...、Za、Zb、Zc、...、ZX、ZY、ZZ。当我阅读代码时,它对我来说很有意义。 (我的经验为零,但我真的觉得这次我写了一些连贯的东西,应该有用)。

然而,事实并非如此。这让我认为我编写/声明/初始化某些内容的方式可能存在一些问题。另外,以下错误代码支持这种想法:

error: array initializer must be an initializer list
char pass2[][1] = "ab";

如果有人意识到问题是什么,请告诉我,因为我已经尝试了所有可能的方法来删除我在 answer 上找到的数组。 ,但我仍然收到错误。好吧,即使我没有收到错误消息,它也不起作用,所以欢迎任何解决方案。

谢谢大家!

正如我之前所说,这是我的完整代码,以防有人想检查它:

#define _XOPEN_SOURCE
#include <cs50.h>
#include <string.h>
#include <stdio.h>
#include <crypt.h>

int main(int argc, string argv[])

{
if (argc!=2){
printf("Usage: ./crack hash\n");
return 1;
}

string options="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char pass1[]="A";
for (int i=0, n=strlen(options); i<n; i++)
{
pass1[0]=options[i];
string hash1=crypt(pass1, "50");
if (memcmp(hash1, argv[1], 13)==0)
{
printf("%c\n", options[i]);
return 0;
}
}

char pass2[0][1] = "aa";
for (int j=0, n=strlen(options); j<n; j++)
{
pass2[0]=options[j];
for (int i=0; i<n; i++)
{
pass2[1]=options[i];
}

string hash2=crypt(pass2, "50");
if (memcmp(hash2, argv[1], 13)==0)
{
printf("%s\n", pass2);
}
}

}

最佳答案

一开始理解 C 数组的真正含义并不容易。问题是,括号符号 [] 在指针和数组之间造成了各种混淆。

这里您需要的是一个能够容纳尽可能大的候选密码的数组。由于它限制为 4 个字符,并且 C 字符串必须有一个终止字符 \0,因此您最多需要 5 个字节。

然后你必须用 1 到 4 个字母的所有可能组合来初始化这个候选字符串,这是一个经典的组合问题。

相当于枚举以 52 为基数的所有 n 位数字(所有可能的字符),或者以 52 为基数从 0 计数到 52n-1,其中 n 在 1 到 4 之间。

生成所有可能的候选密码的循环如下所示:

// despite the array notation, this is a pointer to a constant string of 53 chars
// (including the automatically generated terminating \0)
char Letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
#define ALPHABET_SIZE 52
#define MAX_PASSWORD_LENGTH 4

void try_password (long enumerator, int length)
{
// this is an actual array that can hold 4 chars plus the \0 terminator
char candidate[MAX_PASSWORD_LENGTH+1];
int i;

// convert the enumerator into a base 52 number
// (will be written in reverse order, but in that case we don't care)
for (i = 0 ; i != length ; i++)
{
candidate[i] = Letters[enumerator%ALPHABET_SIZE];
enumerator /= ALPHABET_SIZE;
}
candidate[i] = '\0'; // add string terminator

// check password candidate
if (check_password (candidate))
{
printf ("Yay! %s\n", candidate);
}
}

void try_fixed_length_passwords (int length)
{
long enumerator = 1; // must be big enough to hold 52^^4 - 1 (>= 24 bits)
int i;
for (i = 0 ; i != length ; i++) enumerator *= ALPHABET_SIZE;
// now enumerator = 52^^length
// you could also use math.h and compute enumerator = (long)pow(52,length)

// enumerate all password candidates of a given length
while (enumerator != 0)
{
enumerator--; /// will count from 52^^lenght-1 to 0
try_password (enumerator, length);
}
}

void try_all_passwords (void)
{
// try all possible password lengths
int i;
for (i = 1 ; i <= MAX_PASSWORD_LENGTH ; i++) try_fixed_length_passwords(i);
}

关于c - 像这样初始化一个数组 pass2[2] ="aa";不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com