один и тот же код работает по-разному в UNICODE и в неUNICODE
От: sushko Россия  
Дата: 16.05.17 14:41
Оценка:
Сделал проект в MSVC2010 — обычный dialog box application, в него добавил код ниже. Если компилирую в UNICODE, то в ф-ции DoIt() в переменной rc4Key получаю один результат, если в MBCS — другой. Почему?

typedef struct rc4_key
{      
    unsigned char state[256];       
    unsigned char x;        
    unsigned char y;

    rc4_key()
    {
        x = 0;
        y = 0;
        ZeroMemory(state, 256);
    };
} rc4_key;


void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key)
{
    unsigned char index1;
    unsigned char index2;
    unsigned char* state;
    short counter;     
     
    state = &key->state[0];         
    for(counter = 0; counter < 256; counter++)              
        state[counter] = counter;               
    key->x = 0;     
    key->y = 0;     
    index1 = 0;     
    index2 = 0;             
    for(counter = 0; counter < 256; counter++)      
    {
        index2 = (key_data_ptr[index1] + state[counter] + index2) % 256;                
        swap_byte(&state[counter], &state[index2]);            

        index1 = (index1 + 1) % key_data_len;  
    }       
}
 
static void swap_byte(unsigned char *a, unsigned char *b)
{
    unsigned char swapByte; 
     
    swapByte = *a; 
    *a = *b;      
    *b = swapByte;
}

void DoIt()
{
    rc4_key rc4Key;
    prepare_key(btKey, 16, &rc4Key);
}
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re: один и тот же код работает по-разному в UNICODE и в неUNICODE
От: night beast СССР  
Дата: 16.05.17 14:49
Оценка:
Здравствуйте, sushko, Вы писали:

S>Сделал проект в MSVC2010 — обычный dialog box application, в него добавил код ниже. Если компилирую в UNICODE, то в ф-ции DoIt() в переменной rc4Key получаю один результат, если в MBCS — другой. Почему?


как btKey инициализируется?
Re[2]: один и тот же код работает по-разному в UNICODE и в неUNICODE
От: sushko Россия  
Дата: 16.05.17 14:53
Оценка:
Здравствуйте, night beast, Вы писали:

S>>Сделал проект в MSVC2010 — обычный dialog box application, в него добавил код ниже. Если компилирую в UNICODE, то в ф-ции DoIt() в переменной rc4Key получаю один результат, если в MBCS — другой. Почему?


NB>как btKey инициализируется?


Прошу прощения, забыл написать. Глобальная переменная:

BYTE btKey[] = {205, 188, 10, 192, 198, 169, 158, 195};
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[3]: один и тот же код работает по-разному в UNICODE и в неUNICODE
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 16.05.17 14:56
Оценка: +1
Здравствуйте, sushko, Вы писали:

Выход за пределы массива. btKey длиной 8, а index1 идёт до 15-ти.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[4]: один и тот же код работает по-разному в UNICODE и в неUNICODE
От: sushko Россия  
Дата: 16.05.17 15:01
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Здравствуйте, sushko, Вы писали:


CF>Выход за пределы массива. btKey длиной 8, а index1 идёт до 15-ти.


Блин! Точно. Нарастил btKey — получил один и тот же результат в Unicode и MBCS. Исходный код без сбоев работал у меня в разных проектах лет пятнадцать Теперь надо как-то сообразить сделать исправленный код совместимым со старыми багами
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[5]: один и тот же код работает по-разному в UNICODE и в неUNICODE
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 16.05.17 15:18
Оценка:
Здравствуйте, sushko, Вы писали:

CF>>Выход за пределы массива. btKey длиной 8, а index1 идёт до 15-ти.


S>Блин! Точно. Нарастил btKey — получил один и тот же результат в Unicode и MBCS. Исходный код без сбоев работал у меня в разных проектах лет пятнадцать Теперь надо как-то сообразить сделать исправленный код совместимым со старыми багами


Ну, тут изначально возникают вопросы: а) почему для 8-байтного массива передана длина 16, и б) почему константой, а не sizeof'ом.
Самое очевидное — попробовать указать всё же правильную длину: prepare_key(btKey, 8, &rc4Key), но тут надо разбираться, что конкретно делает алгоритм и как он реагирует на разные входные данные. Я сходу не понял, что это за числодробилка, а ковырять — времени нет.
Если 8 не делает не то, что надо, то выходит, что раньше программа полагалась на наличие некоего мусора за пределами массива — можно попытаться выяснить, что там за мусор, и продублировать его, добив массив до тех же 16-ти байт, что использовались ранее, но теперь уже "легально".
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[6]: один и тот же код работает по-разному в UNICODE и в неUNICODE
От: sushko Россия  
Дата: 16.05.17 15:40
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Ну, тут изначально возникают вопросы: а) почему для 8-байтного массива передана длина 16, и б) почему константой, а не sizeof'ом.


"Нет повести печальнее на свете". Понадобилось добавить в программу шифрование RC4, разбираться в алгоритме, естественно, времени не было, скачал какой-то исходник с CodeGuru, попробовал — работает. Так и таскал его за собой 15 лет из проекта в проект

CF>Если 8 не делает не то, что надо, то выходит, что раньше программа полагалась на наличие некоего мусора за пределами массива — можно попытаться выяснить, что там за мусор, и продублировать его, добив массив до тех же 16-ти байт, что использовались ранее, но теперь уже "легально".


Нулями там все забивалось. Уже выложил исправленную версию программы на сайт
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.