Gah - a solution with more questions. – EntropicLqd

Legacy:XTEA

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

This ia an implementation of the Wikipedia:XTEA cypher.

Code[edit]

const DELTA = 0x9E3779B9;
const ROUNDS = 32;
 
static final function encipher(out int v[2], int k[4])
{
	local int y, z, sum, n;
 
	y=v[0]; z=v[1]; sum=0; n=0;
 
	while(n++ < ROUNDS)
	{
		y += (z << 4 ^ z >>> 5) + z ^ sum + k[sum&3];
		sum += DELTA;
		z += (y << 4 ^ y >>> 5) + y ^ sum + k[sum>>>11 & 3];
	}
 
	v[0]=y; v[1]=z;
}
 
static final function decipher(out int v[2], int k[4])
{
	local int y, z, sum, n;
 
	y=v[0]; z=v[1]; sum=DELTA*ROUNDS; n=0;
 
	while(n++ < ROUNDS)
	{
		z -= (y << 4 ^ y >>> 5) + y ^ sum + k[sum>>>11 & 3];
		sum -= DELTA;
		y -= (z << 4 ^ z >>> 5) + z ^ sum + k[sum&3];
	}
 
	v[0]=y; v[1]=z;
}
 
 
static final function buildkey(string key, out int k[4])
{
	local int i;
 
	for (i = 0; i < 4; i++)
	{
		k[i] = (asc(mid(key, i*4, 1)) << 24) | ((asc(mid(key, i*4+1, 1)) & 0xff) << 16) | ((asc(mid(key, i*4+2, 1)) & 0xff) << 8) | (asc(mid(key, i*4+3, 1)) & 0xff);
	}
}
 
static function string encrypt(string str, string key)
{
	local int i, v[2], k[4]; 
	local string ret;
 
	buildkey(key, k);
 
	while (i < len(str))
	{
		v[0] = (asc(mid(str, i++, 1)) << 24) | ((asc(mid(str, i++, 1))&0xff) << 16) | ((asc(mid(str, i++, 1))&0xff) << 8) | (asc(mid(str, i++, 1))&0xff);
		v[1] = (asc(mid(str, i++, 1)) << 24) | ((asc(mid(str, i++, 1))&0xff) << 16) | ((asc(mid(str, i++, 1))&0xff) << 8) | (asc(mid(str, i++, 1))&0xff);
 
		encipher(v, k);
 
		ret = ret $ DecToHex(v[0], 4) $ DecToHex(v[1], 4);
 
		v[0] = 0; v[1] = 0;
	}
 
	return ret;
}
 
static function string decrypt(string str, string key)
{
	local int i, v[2], k[4]; 
	local string ret;
 
	buildkey(key, k);
 
	while (i < len(str))
	{
		v[0] = HexToDec(Mid(str, i, 8));
		i+=8;
		v[1] = HexToDec(Mid(str, i, 8));
		i+=8;
 
		decipher(v, k);
 
		ret = ret $ Chr((v[0] >>> 24) & 0xff) $ Chr((v[0] >>> 16) & 0xff) $ Chr((v[0] >>> 8) & 0xff) $ Chr(v[0] & 0xff);
		ret = ret $ Chr((v[1] >>> 24) & 0xff) $ Chr((v[1] >>> 16) & 0xff) $ Chr((v[1] >>> 8) & 0xff) $ Chr(v[1] & 0xff);
 
		v[0] = 0; v[1] = 0;
	}
 
	return ret;
}
 
static final function int HexToDec(string hexcode) // Borrowed from ElMuerte's LibHTTP
{
	local int res, i, cur;
 
	res = 0;
	hexcode = Caps(hexcode);
	for (i = 0; i < len(hexcode); i++)
	{
		cur = Asc(Mid(hexcode, i, 1));
		if (cur == 32) return res;
		cur -= 48; // 0 = ascii 30
		if (cur > 9) cur -= 7;
		if ((cur > 15) || (cur < 0)) return -1; // not possible
		res = res << 4;
		res += cur;
	}
	return res;
}
 
 
static final function string DecToHex(int dec, int size)
{
	const hex = "0123456789ABCDEF";
	local string s;
	local int i;
 
	for (i = 0; i < size*2; i++)
	{
		s = mid(hex, dec & 0xf, 1) $ s;
		dec = dec >>> 4;
	}
 
	return s;
}

Usage[edit]

To encrypt a message use:

EncryptedMessage = encrypt(Message, Key)

To decrypt a message use:

Message = decrypt(EncryptedMessage, Key)

License[edit]

Copyright 2004 (c) Petr Jelinek

Released under the LesserOpenUnrealModLicense

Related Articles[edit]