| Home Page | Recent Changes

XTEA

This ia an implementation of the Wikipedia logo XTEA cypher.

Code

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

To encrypt a message use:

EncryptedMessage = encrypt(Message, Key)

To decrypt a message use:

Message = decrypt(EncryptedMessage, Key)

License

Copyright 2004 (c) Petr Jelinek

Released under the LesserOpenUnrealModLicense

Related Articles


Category Algorithm

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In