Работаю над реализацией взломщика sha1 как университетский проект. Я пробую разные значения с циклом для их хеш-значения.

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-значного слова в каждой опции.

Если я сейчас попытаюсь переместить строку объявления uint32_t перед первым циклом for (но все еще в той же функции, компилятор C предупредит меня, что переменные не используются, и программа выйдет из строя, поскольку эти переменные, похоже, потеряны в цикле Но по соображениям производительности я не хочу каждый раз объявлять их новыми. Если я попытаюсь объявить их глобально, произойдет та же проблема. Но когда они объявляются в последнем цикле, все работает нормально

1
chenino 25 Ноя 2016 в 21:46

2 ответа

Лучший ответ

Вы объявляете переменные дважды. Каждый for(int x объявляет переменную. Вы должны иметь возможность вывести uint32_t a,b,c ... из цикла и перед первым for И вам нужно удалить int из каждого оператора for.

Это должно скомпилироваться (я не знаю, будет ли код работать или делать то, что вы хотите, поскольку вы, кажется, сбрасываете переменные цикла внутри самого внутреннего цикла):

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;

Или, как вы говорите в своем комментарии, вам нужно переименовать свои переменные, чтобы не переопределять переменные цикла, как показано здесь:

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);

                        uint32_t A,B,C,D,E,temp; // var "a" is not "A"
                        uint32_t w[80]= {0};


                        // Declarations
                        A=h0;
                        B=h1;
                        C=h2;
                        D=h3;
                        E=h4;
0
HeatfanJohn 25 Ноя 2016 в 19:01

Если теперь я попытаюсь переместить строку объявления uint32_t перед первым циклом for (но все еще в той же функции, компилятор C предупредит меня, что переменные не используются, и программа выйдет из строя, поскольку эти переменные, похоже, потеряны в цикле.

Если поставить uint32_t a; uint32_t b; ... uint32_t e; снаружи, а затем повторно объявить как int a; int b; ... int e; , переменные, объявленные как тип uint32_t, выходят за рамки. В самом внутреннем цикле for переменные a, b, ..., e объявлены в операторе for. В конце концов, для циклов int a, ..., e находятся вне области видимости, и будут использоваться переменные uint32_t. Но им не присвоено желаемое значение.

Если вы поместите объявления uint32_t во внутренний цикл for, uint32_t будут в области видимости, а эти int находятся вне области видимости (или я должен сказать, что они «переопределены»?).

Но по соображениям производительности я не хочу каждый раз объявлять их новыми.

Пусть компилятор оптимизирует его, если вы действительно хотите сохранить вложенные циклы, как сейчас. Переменные не объявляются повторно каждый раз при выполнении внутреннего цикла. Вы можете сравнить результат сборки кода. В противном случае, рассмотрите совет @JonathanLeffler, разделите их на функции, чтобы сделать ваш код более читабельным.

Если я допустил ошибку, не стесняйтесь указывать на нее / их! Спасибо!

0
Zhigang An 26 Ноя 2016 в 02:03