Помогите поймать ошибку

160
07 апреля 2019, 23:00

Кратко: Есть 3 функции. Они запускаются в разных конфигурациях: 1. функция А - основная функция, она вызывает функцию Б, которая вызывает(уже в своем теле) функцию В, так, что функция В вызывается после всех инструкций функции Б. 2. А - по-прежнему основная функция, но на этот раз она вызывает обе функции(сначала Б, потом В (но при этом Б не вызывает В)). И в первом, и во втором случае входные значения функции В одинаковые. Вопрос состоит в том, почему в обоих случаях результат работы В разный? От абстракции к коду: Случай 1. Функция А:

void split_the_file (unsigned char * arr_blocks,
        ifstream & in_f,
        int size_arr, unsigned char (&key)[16], ofstream & of_f){
    in_f.seekg (0, in_f.end);
    int end_f = in_f.tellg();
    in_f.seekg (0, in_f.beg);
    int current = 0;
    char ch = 0;
    while (!in_f.eof() && ((end_f - current) >= SIZE_OF_BLOCK * SIZE_OF_BLOCK)){
      for (int i = 0; i < SIZE_OF_BLOCK; i++){
           for (int j = 0; j < SIZE_OF_BLOCK; j++){
              in_f >> arr_blocks[i*SIZE_OF_BLOCK + j];
           }
           current = in_f.tellg();
      }
      //func cipher uses one block 4*4
      **aes_main(arr_blocks, key);** //Функция Б
      writef (of_f, arr_blocks);
    }
}

Функция Б:

void aes_main(unsigned char* block,
              unsigned char  (&key)[16]){
    auto new_key = expand_key (key);
    unsigned char* state = new unsigned char[SIZE_OF_BLOCK*SIZE_OF_BLOCK];
    fill_the_state(block, state);
    unsigned char a [16];
    AddRoundKey (new_key, state, 0);
    for (int round = 1; round < Nr; round++){
        SubBytes(state);
        ShiftRows(state);
        MixColomns(state);
        AddRoundKey (new_key, state, round);
    }
    SubBytes(state);
    ShiftRows(state);
    AddRoundKey (new_key, state, Nr);
    fill_the_block(block, state);
   **Inv_aes_main(block, key);**//Функция В
    delete (new_key);
    delete (state);
}

Функция В:

void Inv_aes_main(unsigned char * block, unsigned char  (&key)[16]){
    auto new_key = expand_key (key);
    unsigned char* state = new unsigned char[SIZE_OF_BLOCK*SIZE_OF_BLOCK];
    fill_the_state(block, state);
    AddRoundKey (new_key, state, Nr);
  for (int round = Nr - 1; round > 0; round--){
      InvShiftRows(state);
      InvSubBytes(state);
      AddRoundKey (new_key, state, round);
      InvMixColomns(state);
  }
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey (new_key, state, 0);
  fill_the_block(block, state);
  delete (state);
  delete (new_key);
}

Случай 2. Функция А:

void split_the_file (unsigned char * arr_blocks,
        ifstream & in_f,
        int size_arr, unsigned char (&key)[16], ofstream & of_f){
    in_f.seekg (0, in_f.end);
    int end_f = in_f.tellg();
    in_f.seekg (0, in_f.beg);
    int current = 0;
    char ch = 0;
    while (!in_f.eof() && ((end_f - current) >= SIZE_OF_BLOCK * SIZE_OF_BLOCK)){
      for (int i = 0; i < SIZE_OF_BLOCK; i++){
           for (int j = 0; j < SIZE_OF_BLOCK; j++){
              in_f >> arr_blocks[i*SIZE_OF_BLOCK + j];
           }
           current = in_f.tellg();
      }
      //func cipher uses one block 4*4
      **aes_main(arr_blocks, key);**//Функция Б
      **Inv_aes_main(arr_blocks, key);**//Функция В
     writef (of_f, arr_blocks);
    }
}

Функция Б:

void aes_main(unsigned char* block,
              unsigned char  (&key)[16]){
    auto new_key = expand_key (key);
    unsigned char* state = new unsigned char[SIZE_OF_BLOCK*SIZE_OF_BLOCK];
    fill_the_state(block, state);
    unsigned char a [16];
    AddRoundKey (new_key, state, 0);
    for (int round = 1; round < Nr; round++){
        SubBytes(state);
        ShiftRows(state);
        MixColomns(state);
        AddRoundKey (new_key, state, round);
    }
    SubBytes(state);
    ShiftRows(state);
    AddRoundKey (new_key, state, Nr);
    fill_the_block(block, state);
    delete (new_key);
    delete (state);
}

Функция fill_the_block:

void fill_the_block (unsigned char * block,
                     unsigned char * state){
    for (int i = 0; i < SIZE_OF_BLOCK; i++){
        for (int  j = 0; j < SIZE_OF_BLOCK; j++){
            block[i*SIZE_OF_BLOCK+j] = state[j*SIZE_OF_BLOCK + i];
        }
    }
}

Она служит для заполнения block из массива state по некоторому правилу. Т.е. после этого содержимое block меняется. Функция fill_the_state:

void fill_the_state (unsigned char * block,
        unsigned char * state){
    memset(state,0,SIZE_OF_BLOCK*SIZE_OF_BLOCK);
    for (int i = 0; i < SIZE_OF_BLOCK; i++){
        for (int  j = 0; j < SIZE_OF_BLOCK; j++){
            state[j*SIZE_OF_BLOCK + i] = block[i*SIZE_OF_BLOCK+j];
        }
    }
}

Функция - по смыслу обратная к fill_the_block. Выделение памяти под arr_blocks:

    int main(int argc, char** argv) {
        ifstream in_f;
        ofstream of_f;
        unsigned char key[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
        in_f.open("/home/alex/Загрузки/ciph.txt");
        in_f >> std::noskipws;
        of_f.open("/home/alex/Загрузки/cipher_out.txt");
        in_f.seekg (0, in_f.end);
        int length = in_f.tellg();
        in_f.seekg (0, in_f.beg);
//выделение памяти под массив arr_blocks
        unsigned char* arr = new unsigned char[SIZE_OF_BLOCK*SIZE_OF_BLOCK];
        split_the_file(arr, in_f, SIZE_OF_BLOCK, key, of_f);
        in_f.close();
        of_f.close();
        delete(arr);
        return 0;
    }

AddRoundKey:

void AddRoundKey(unsigned int *extandedKey, unsigned char *state, int rnd) {
    for(int i=0; i<4; i++) {
        state[i]    ^= extandedKey[4*rnd+i] >> 24;
        state[4+i]  ^= extandedKey[4*rnd+i] >> 16;
        state[8+i]  ^= extandedKey[4*rnd+i] >> 8;
        state[12+i] ^= extandedKey[4*rnd+i];
    }
}

Функция В та же. Так почему же при одинаковых входных значениях разные выходные? Скорее всего, я не вижу какого-нибудь элементарного бага.

READ ALSO
Никак не могу открыть файл

Никак не могу открыть файл

Писал упражнение, написал простейший ввод из файла, а он не работаетСвёл к этому, оно, как ни странно тоже не работает, ещё и выдаёт ошибки...

162
есть ли команда для заморозки

есть ли команда для заморозки

Написал кодКод выводит оцифрованную сетку

164
Передача массива в рекурсивную функцию

Передача массива в рекурсивную функцию

У меня есть рекурсивная функция,которая вызывает саму себя 5 раз int rec( int **array)Как сделать так,что бы передаваемый массив не менялся в предыдущем...

163