реклама на сайте
подробности

 
 
> Алгоритм шифрования, где найти реализацию?
Ivan Kuznetzov
сообщение Mar 4 2010, 15:44
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Подскажите пожалуйста алгоритм шифрования/дешифрования потоковых данных. (есть массив из n байт, его надо зашифровать и расшифровывать на приеме, зная ключ), смотрел в сторону xxtea, работает только с long.
может тупо биты в байте переставлять, наподобие DES ? rolleyes.gif

P.S.
может у кого есть xxtea, который бы с потоком работал?


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ivan Kuznetzov
сообщение Mar 11 2010, 09:49
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



ничего не понимаю... есть шифратор XTEA, который шифрует массив из 64-x long-гов, написан на Pascal. И есть точно такой-же код дешифратора, только на Си и в микроконтроллере, который кушает с флехи 256 байт в буфер и дешифрует их как (long*). дык вот непонятно почему код на си "переворачивает" каждый long (из 64-х) задом-наперёд. Если декодировать с помощью дельфи, то последовательность правильная получается.

код в Делфи:
Код
type
TTeaData = array of Longword;

procedure XTeaBlockEncrypt(var data: TTeaData; const key: TTeaKey; N: Longword = 2);
var
  y,z,sum,limit: Longword;
  i,no:integer;
begin
  no := Length(data);
  i:=0;
while (i < no ) do
begin

  y:=data[i];
  z:=data[i+1];
  sum:=0;
  limit := Delta*N;

  while sum <> limit do
  begin
    inc(y,(((z shl 4) xor (z shr 5)) + z) xor (sum+key[sum and 3]));
    inc(sum,Delta);
    inc(z,(((y shl 4) xor (y shr 5)) + y) xor (sum+key[(sum shr 11) and 3]));
  end;

  data[i]:=y;
  data[i+1]:=z;
  inc(i,2);
end;

end;


Код в МК:
Код
void xtea_dec(unsigned long* data, unsigned char dataLength)
{
    unsigned char i=0;
    unsigned long x1;
    unsigned long x2;
    unsigned long sum;
    unsigned long iterations;
      
    iterations = NUM_ITERATIONS;
    
    while(i<dataLength)
    {
        sum = DELTA*iterations;
        x1=*data;
        x2=*(data+1);

        while(sum != 0)
        {
          x2 -= ((((x1<<4) ^ (x1>>5)) + x1) ^ (sum + key[(sum>>11)&0x03]));
          sum-=DELTA;
          x1 -= ((((x2<<4) ^ (x2>>5)) + x2) ^ (sum + key[sum&0x03]));
        }
              
        *(data++)=x1;
        *(data++)=x2;
        i+=2;
    }    
}


res = f_read(&fil,buffer,sizeof(buffer),&br); //читаем массив с флешки

xtea_dec((unsigned long*)buffer, (sizeof(buffer)/4));  //декодируем массив


кстати, при кодировании/декодировании самой мегой проц, случае с байтами, тоже задом-наперед результат ставит, вот результат из терминала протеуса:
Код
(char) operation:
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
[b]8D 1 87 4D[/b] D F0 DE FF 8D 1 87 4D D F0 DE FF 8D 1 87 4D D F0 DE FF 8D 1 87 4D D F0 DE FF
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33

(Long) operation:
33333333 33333333 33333333 33333333 33333333 33333333 33333333 33333333
[b]4D87018D[/b] FFDEF00D 4D87018D FFDEF00D 4D87018D FFDEF00D 4D87018D FFDEF00D
33333333 33333333 33333333 33333333 33333333 33333333 33333333 33333333


А если забить на все эти преобразования из long в char и оперировать там-и-там с long, как тогда лонг можно побайтно выдать в SPI, причем пачками не более 32-х байт?
с массивом байт все просто, а как с long massiv[64] сделать?:
Код
for(j=0;j<sizeof(buffer);j+=32){
while (!DREQ);
vs_stream(&buffer[j],32);}


Сообщение отредактировал Ivan Kuznetzov - Mar 11 2010, 09:54


--------------------
Разработчик
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 08:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016