Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: простой криптоалгоритм
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
mr_freeman
Добрый день.

пока сижу без дела со сломаной ногой, захотел попробовать реализовать какой-нить простой криптоалгоритм на AVR.
Взял, например, этот:
CODE

Объявляем переменные:
volatile unsigned int xi=0;
volatile unsigned long sum=0, delta=0x9E3779B9;
volatile unsigned long v0 = 0;
volatile unsigned long v1 = 0;
volatile unsigned long kx[4];
volatile unsigned long cx=0;

где-то там записываем в них значения...

Сам алгоритм:
void xtea_encipher()
{
char i,xi;
v0=0;
v1=0;
for (i=0; i < 32; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + kx[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + kx[(sum>>11) & 3]);
}
for(xi=0;xi<4;xi++)
{
STRING_OUT[xi]= v0;
STRING_OUT[4+xi]= v1;
v0 >>=8;
v1 >>=8;
}
v0=0;
v1=0;
printf(" %s ",STRING_OUT);
}

основной цикл.
while (1)
{
xtea_encipher();
delay_ms(200);
};


Основные отрывки программы привел.

Сразу прошу извинить меня за быдлокод и т д - программист из меня никудышный.

Короче суть проблемы - входящие дынные одни и те же, они не изменяются (даже с помощью дебагера проверял), но функция с каждым ее вызовом возвращает отличающиеся данные. Тоесть при запуске программы данные каждый раз одни и те же, но они разные с каждым последующим вызовом функции. Алгоритмы пробовал разные, но результат один. Протеус говорит, что все переменные всегда, с каждым вызовом одни и те же, кроме v0 и v1 после обработки алгоритма.
Переменные в программе 32-битные. Подозреваю, что это происходит из-за переполнения переменной.

Подскажите пожалуйста, или ткните пальцем, что не так.

Кстати, пишу в CvAVR.
KRS
Цитата(mr_freeman @ Aug 27 2011, 22:46) *
но функция с каждым ее вызовом возвращает отличающиеся данные.

у вас в функции используются переменные которые проинициализированы один раз (перед первым вызовом функции). и некоторые перменные меняются, например sum. Т.е. при каждом новом вызове функции по крайней мере sum будет разной.
mr_freeman
Цитата(KRS @ Aug 28 2011, 00:11) *
у вас в функции используются переменные которые проинициализированы один раз (перед первым вызовом функции). и некоторые перменные меняются, например sum. Т.е. при каждом новом вызове функции по крайней мере sum будет разной.


Спасибо, заметил уже.
Тем не менее, это все после танцов с бубном переносил эти переменные туда-сюда. Раньше они были локальными.
Сейчас назад перенес их в локал. Добавил на всякий их сброс в 0 перед самым алгоритмом - все равно не работает - результат всегда разный.

Мне кажется тут особенности работы с 32-битными переменными мод МК.

Вот скриншот с протеуса (до реального железа пока добраться не могу).
Почему-то он не хочет отображать 32-битные переменные, и показывает только два младших байта.
Все переменные всегда на данном брейкпойнте одинаковы, меняются лишь после алгоритма. И меняются всегда в по разному.
KRS
Цитата(mr_freeman @ Aug 28 2011, 01:35) *
Мне кажется тут особенности работы с 32-битными переменными мод МК.

стандартный код на С, все должно работать!

Цитата(mr_freeman @ Aug 28 2011, 01:35) *
Вот скриншот с протеуса (до реального железа пока добраться не могу).
Почему-то он не хочет отображать 32-битные переменные, и показывает только два младших байта.

там и тип стоит word - т.е. два байта!

А вы листинг смотрели?
А лучше выложите полный исходник части шифования! И почему у вас исходные значения и ключ равны 0?
mr_freeman
Цитата(KRS @ Aug 28 2011, 21:40) *
стандартный код на С, все должно работать!


там и тип стоит word - т.е. два байта!

А вы листинг смотрели?
А лучше выложите полный исходник части шифования! И почему у вас исходные значения и ключ равны 0?


Не знаю, где Вы там увидели, что они равны 0.
Полный код вот. Курочил его весь день, так что может быть не рационально. Но всегда результат один и тот же
Код
void xtea_encipher()
{
    volatile unsigned int xi=0;  
    volatile unsigned long sum=0, delta=0x9E3779B9;
    volatile unsigned long v0 = 0;  
    volatile unsigned long v1 = 0;
    volatile unsigned long kx[4];  
     volatile unsigned long cx=0;
    
      
    for (xi=0; xi < 4; xi++)    
    {
        kx[xi]=0;
    }
    for (xi=0; xi < 3; xi++)    
    {  
        v0=v0+REQUEST[xi];  
        v1=v1+REQUEST[4+xi];  
        
        kx[0]=kx[0]+REQUEST[xi];    
        kx[1]=kx[1]+REQUEST[xi+4];
        kx[2]=kx[2]+REQUEST[xi+8];    
        kx[3]=kx[3]+REQUEST[xi+12];
                
        if(xi!=2)
        {
            v0 <<=8;  
            v1 <<=8;    
            
            kx[0] <<=8;  
            kx[1] <<=8;
            kx[2] <<=8;
            kx[3] <<=8;  
        }
    }  

     sum=0;    
     delta=0x9E3779B9;
      
     for (xi=0; xi < num_rounds; xi++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + kx[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + kx[(sum>>11) & 3]);
    }  

    for(xi=0;xi<4;xi++)  
    {
        STRING_OUT[xi]= v0;
        STRING_OUT[4+xi]= v1;
        v0 >>=8;
        v1 >>=8;
    }        
    v0=0;
    v1=0;
    printf(" %s ",STRING_OUT);    
}


Все! Проблему решил, всем спасибо!
Все ошибки же перед глазами были!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.