Помогите с криптоалгоритмом под AVR

Добрый день.

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

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;  
        }
    }  
           /*  kx[0]=976;  
            kx[1]=38790;
            kx[2]=4646;
            kx[3]=45;    
        v0=45674;  
        v1=47839;  */  
        
     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+32;xi++){ 

    }
    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.

Спасибо

Комментарии (20)

RSS свернуть / развернуть
А что за массив REQUEST?
0
Массив, который шифруется. В будущем будет динамическим, а пока так volatile char REQUEST[]=«dfew)fdw»;
0
Почему тогда при длине массива в 8 символов и изменении xi от 0 до 3 вы вот тут вылазите за пределы массивы — kx[3]=kx[3]+REQUEST[xi+12] Может как раз в этом «косяк»
0
ВОТ СПАСИБО!!! БЛИН, ЦЕЛЫЙ ДЕНЬ СМОТРЕЛ НА КОД И НЕ ЗАМЕЧАЛ ОЧЕВИДНОГО.
0
ТАМ ЖЕ КЛЮЧ ДОЛЖЕН БЫЛ БЫТЬ!
Исправил!
volatile char KEY[]="ThisThisThisThis";


    for (xi=0; xi < 4; xi++)    
    {  
        v0=v0+REQUEST[xi];  
        v1=v1+REQUEST[4+xi];  
        
        kx[0]=kx[0]+KEY[xi];    
        kx[1]=kx[1]+KEY[xi+4];
        kx[2]=kx[2]+KEY[xi+8];    
        kx[3]=kx[3]+KEY[xi+12]; 
                
        if(xi!=3)
        {
            v0 <<=8;  
            v1 <<=8;     
            
            kx[0] <<=8;  
            kx[1] <<=8;
            kx[2] <<=8;
            kx[3] <<=8;  
        }
    }  

Вот что значит взгляд со стороны, да еще и умного человека!
Спасибо!
0
А разве при одной и той же программе и одних и тех же исходных данных будут тут какие-нибудь различия между запусками?

(чуть подумав)Разве что при ресете далеко не всё обнуляется… А при переигрывании питанием различий точно браться не должно…
0
Результат изменялся в пределах нормального питания, тоесть резет — пачки фигни разной, резет — опять те же пачки фигни, но опять сначала по новому кругу.
0
Значит дело точно в том, что что-то в памяти на что-то важное налезает!
0
Не зря же советуют обнулять всю область памяти. Мало ли какая бяка там вылезет. Да и во многих проектах Ди я это видел. ))
0
Эм, тупой вопрос, но как обнулить ВСЮ область памяти?
0
А вы гляньте проект rtos у Ди, вроде там я видел, но исполнение на ассме
0
Могли неправильно друг друга понять, я имел ввиду оперативку, вовсе не флэш.
Вообще когда речь идет о сложных мат расчетах я всегда слежу за правильностью выделения памяти и чищу массивы перед использованием.
0
на ассеме все равно нифига не пойму. только скопировать.
0
я понял что оперативку)
0
Да всё очень просто! В цикле FOR перебираем все адреса RAM (аккуратно стараемся не задеть область портов ввода-вывода...) и записываем туда нули
0
И настройках проекта на закладке c-compiler -> code generation ->(s)printf Features поставьте float, width, precision
0
щас проверю
0
все равно то же самое, только объем памяти в 2 раза увеличился.
0
Просто printf теперь плавающую точку подключил. Но это только при выводе float играет роль. У вас что то другое.
0
Проблема решена.
Всем спасибо!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.