Кратко: Есть 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];
}
}
Функция В та же. Так почему же при одинаковых входных значениях разные выходные? Скорее всего, я не вижу какого-нибудь элементарного бага.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Писал упражнение, написал простейший ввод из файла, а он не работаетСвёл к этому, оно, как ни странно тоже не работает, ещё и выдаёт ошибки...
У меня есть рекурсивная функция,которая вызывает саму себя 5 раз int rec( int **array)Как сделать так,что бы передаваемый массив не менялся в предыдущем...