ничего не понимаю... есть шифратор 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);}