我正在研究sha1 cracker作为大学项目的实施。 我正在尝试使用循环获取其哈希值的不同值。
for(int a=0; a<26; a++)
{
for(int b=0; b<26; b++)
{
for(int c=0; c<26; c++)
{
for(int d=0; d<26; d++)
{
for(int e=0; e<26; e++)
{
for(int f=0; f<26; f++)
{
result[0]=alphabet[a];
result[1]=alphabet[b];
result[2]=alphabet[c];
result[3]=alphabet[d];
result[4]=alphabet[e];
result[5]=alphabet[f];
//printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);
// Declarations
uint32_t a,b,c,d,e,temp;
uint32_t w[80]= {0};
a=h0;
b=h1;
c=h2;
d=h3;
e=h4;
下面的代码只是正在进行的SHA-1代码。 外部的循环用于测试每个选项的6个字符的单词。
如果我现在尝试在第一个for循环之前移动uint32_t
声明行(但仍然在同一个函数中,C编译器警告我变量未使用,程序崩溃,因为这些变量似乎丢失了在循环中。但出于性能原因,我不想每次都声明它们。
如果我尝试全局声明它们,则会出现同样的问题。但是当它们在最后一个循环中声明时,一切正常
答案 0 :(得分:0)
您要将变量声明两次。每个Stretch
声明变量。您应该能够将for(int x
移出循环,并在第一个uint32_t a,b,c ...
之前移动。您需要从每个for语句中删除for
。
这应该编译(我不知道代码是否会起作用或者做你想做的事情,因为你似乎正在重置最内层循环中的循环变量):
int
或者正如您在评论中所说,您需要将变量重命名为不重新定义循环变量,如下所示:
uint32_t a,b,c,d,e,temp;
uint32_t w[80]= {0};
for(a=0; a<26; a++)
{
for(b=0; b<26; b++)
{
for(c=0; c<26; c++)
{
for(d=0; d<26; d++)
{
for(e=0; e<26; e++)
{
for(f=0; f<26; f++)
{
result[0]=alphabet[a];
result[1]=alphabet[b];
result[2]=alphabet[c];
result[3]=alphabet[d];
result[4]=alphabet[e];
result[5]=alphabet[f];
//printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);
// Declarations
a=h0;
b=h1;
c=h2;
d=h3;
e=h4;
答案 1 :(得分:0)
如果我现在尝试在第一个for循环之前移动uint32_t Declaration行(但仍然在同一个函数中,C编译器警告我变量未使用,程序崩溃,因为这些变量似乎在循环中丢失。
如果你把uint32_t a; uint32_t b; ... uint32_t e;在外面,然后重新声明为int a; int b; ... int e; ,声明为uint32_t类型的变量超出范围。在最内部的for循环中,变量a,b,...,e是在for语句中声明的变量。在所有for循环之后,int a,...,e超出范围,并且将使用uint32_t变量。但它们没有分配到所需的值。
如果你把uint32_t声明放在内部for循环中,那么uint32_t就在范围内,那些int超出了范围(或者我应该说它们是&#34;被覆盖&#34 ;?)。
但出于性能原因,我不想每次都宣布它们。
如果你真的想保留像现在这样的嵌套循环,让编译器优化它。每次执行内部循环时都不会重新声明变量。您可以比较结果汇编代码。否则,请考虑@JonathanLeffler的建议,将它们分成函数以使代码更具可读性。
如果我犯了任何错误,请不要犹豫,指出它们/它们!谢谢!