1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| XTEA Block
---------------------------------------------------------------------------*/
void XTEA_Decrypt(BYTE* Buf, BYTE* Key)
{
DWORD v0, v1, delta, sum, k1, k2;
int i;
v0 = *((DWORD*)(Buf+0));
v1 = *((DWORD*)(Buf+4));
delta = 0x9E3779B9;
sum = 32 * delta;
for (int i=0; i<32; i++)
{
k1 = *((DWORD*)(Key+((sum>>9)& 0x0C)));
v1-= (((v0<<4)^(v0>>5)) + v0)^(sum + k1);
sum-=delta;
k2 = *((DWORD*)(Key+((sum & 0x03)<<2)));
v0-= (((v1<<4)^(v1>>5)) + v1)^(sum + k2);
}
*((DWORD*)(Buf+0)) = v0;
*((DWORD*)(Buf+4)) = v1;
}
/*---------------------------------------------------------------------------
cbc buggy xtea function
---------------------------------------------------------------------------*/
void XTEA_Bloc_Decrypt(BYTE* Buf, DWORD Size, BYTE* Key)
{
BYTE* pBlock;
BYTE* pMask;
//Last 8 bytes aligned bloc
pBlock = Buf + ((Size - 8) & 0xFFFFFFF8);
if (Size>8)
{
for (DWORD i = 0; i<Size/8; i++)
{
//Choose IV
if (pBlock!=Buf)
pMask = pBlock - 8;
else
pMask = Buf+Size-8; //Last complete
//xor block (buggy cbc-> should be done after decrypting)
for (int j = 0; j<8; j++)
pBlock[j] ^= pMask[j];
//decrypt block
XTEA_Decrypt(pBlock, Key);
//next block
pBlock-=8;
}
//decrypt again last block
XTEA_Decrypt(pMask, Key);
}
}
//--------------------------------------------------------------------------- |
Partager