czy ktoś z was implementował algorytm xxtea?
jest sobie metoda szyfrowania xxtea - http://en.wikipedia.org/wiki/XXTEA
kalkulator online: http://www.tools4noobs.com/online_tools/xxtea_encrypt/ zwraca wynik w base64. dekoder: http://www.opinionatedgeek.com/dotnet/tools/base64decode/
chciałem sobie zaimplementować ten algorytm, skopiowałem na żywca z wiki i coś nie działa...
kod programu:
#include <stdint.h>
#include <cstdio>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const k[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1)
{ /* Coding Part */
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
} while (--rounds);
}
else
if (n < -1)
{ /* Decoding Part */
n = -n;
rounds = 6 + 52/n;
sum = rounds*DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
} while ((sum -= DELTA) != 0);
}
}
int main (int argc, char **argv)
{
const uint32_t key[4] = {1,0,0,0}; //Klucz : 1
int arrSize=2;
uint32_t *arr = new uint32_t[arrSize] ;
arr[0] = 0x64636261 ; //abcd
arr[1] = 0x00000065 ; //e null null null
printf("Before:\n") ;
for(int i=0; i<arrSize; ++i)
{
printf("%4d. %010u : 0x%08X\n",i,arr[i],arr[i]) ;
}
btea(arr, arrSize, key) ;
printf("After:\n") ;
for(int i=0; i<arrSize; ++i)
{
printf("%4d. %010u : 0x%08X\n",i,arr[i],arr[i]) ;
}
delete []arr ;
return 0 ;
}
output:
Before:
0. 1684234849 : 0x64636261
1. 0000000101 : 0x00000065
After:
0. 3706564509 : 0xDCEDAF9D
1. 3506583760 : 0xD10238D0
Ale kalkulator ze strony mówi mi, że poprawny wynik przy tym kluczu to:
tnvCzCaXgtuZ6EL0 w base64 czyli po zdekodowaniu:
00000000 B6 7B C2 CC 26 97 82 DB 99 E8 42 F4 .{..&.....B.
[otwarte hex-editorem]
Nie zgadza mi się. I dlaczego w tym algorytmie ze strony w outpucie jest 12 bajtów, nie 8?
jeśli ktoś coś wie o tym, to proszę o rady.