Click here to Skip to main content
11,712,503 members (72,883 online)
Click here to Skip to main content

Tiny Encryption Algorithm (TEA) for the Compact Framework

, 29 Feb 2004 CPOL 208.9K 1.7K 65
Rate this:
Please Sign up or sign in to vote.
Learn how to secure sensitive data using TEA encryption.

Sample Image - teaencryption.jpg

Introduction

The Compact Framework omits the main encryption features in the Cryptography namespace to make room for more important features. Fortunately, it is not terribly difficult to implement some sort of cryptography to hide your sensitive data. I wanted to find a small algorithm that was secure and portable. After doing a little searching, I ran across the Tiny Encryption Algorithm (TEA). This algorithm was developed in 1994 by David Wheeler and Roger Needham of Cambridge University. This algorithm is extremely portable, and fast. There has been a successful cryptanalysis performed on the original TEA algorithm which caused the original authors to modify the TEA algorithm. The revised algorithm is called XTEA. There is not much information on this algorithm so there is no guarantee that the XTEA algorithm has not been broken as well. However, this algorithm could still be useful for applications that do not require the highest of security. The original algorithm was developed in C, but constructed in such a way that it is easy to port to other languages, like C#. I was able to port the original C algorithm to C# with minimal changes. I tested the algorithm on the full .NET Framework as well as the .NET Compact Framework and it works great on both platforms with no changes.
For more information on how TEA encryption works, refer to the links at the bottom of this article.

Background

The Tiny Encryption Algorithm works on the principle of paired blocks of data. This makes it a little more challenging to prepare strings for encryption because you need to pass pairs of unsigned integers to the algorithm and then store them in some manner so the data can be recovered at a later point in time. I use some bit shifting to convert between integers and strings, so a little knowledge of number systems will help you out.

Using the code

Porting the code to C# was the easy part. After porting the C algorithm to C#, I ended up with the following function for encryption:

private void code(uint[] v, uint[] k)
{
    uint y = v[0];
    uint z = v[1];
    uint sum = 0;
    uint delta=0x9e3779b9;
    uint n=32;

    while(n-->0)
    {
        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;
}

Simple huh? They don't call it tiny for nothing! Here is the decrypt function:

private void decode(uint[] v, uint[] k)
{
    uint n=32;
    uint sum;
    uint y=v[0];
    uint z=v[1];
    uint delta=0x9e3779b9;

    sum = delta << 5 ;

    while(n-->0)
    {
        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;
}

Note: I only modified what was necessary to get the code to compile. I also formatted the code to make it a little more readable. In the original algorithm, they used an unsigned long for the variables. In C, an unsigned is a 32-bit unsigned integer. In .NET land, the equivalent is an unsigned integer.

Now we have reached the challenging part. To use the algorithm with strings, we have to convert the strings into an acceptable format. Here is a basic run-through of what I did to make use of the algorithm:

  • Make the string an even length by adding a space to the end of it if necessary. We need to do this because the algorithm expects pairs of data.
  • Convert the string to an array of bytes.
  • Loop through the array and pass a pair of values to the encrypt function.
  • Convert the two cipher values to strings and append to one long string.

My Encrypt function looks something like the following:

public string Encrypt(string Data, string Key)
{
    uint[] formattedKey = FormatKey(Key);

    if(Data.Length%2!=0) Data += '\0'; // Make sure array is even in length.
    byte[] dataBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(Data);

    string cipher = string.Empty;
    uint[] tempData = new uint[2];
    for(int i=0; i<dataBytes.Length; i+=2)
    {
        tempData[0] = dataBytes[i];
        tempData[1] = dataBytes[i+1];
        code(tempData, formattedKey);
        cipher += ConvertUIntToString(tempData[0]) + 
                          ConvertUIntToString(tempData[1]);
    }

    return cipher;
}

The Decrypt function basically is just the reverse of the encrypt function:

public string Decrypt(string Data, string Key)
{
    uint[] formattedKey = FormatKey(Key);

    int x = 0;
    uint[] tempData = new uint[2];
    byte[] dataBytes = new byte[Data.Length / 8 * 2];
    for(int i=0; i<Data.Length; i+=8)
    {
        tempData[0] = ConvertStringToUInt(Data.Substring(i, 4));
        tempData[1] = ConvertStringToUInt(Data.Substring(i+4, 4));
        decode(tempData, formattedKey);
        dataBytes[x++] = (byte)tempData[0];
        dataBytes[x++] = (byte)tempData[1];
    }

    string decipheredString = 
            System.Text.ASCIIEncoding.ASCII.GetString(dataBytes, 
                                                      0, dataBytes.Length);

    // Strip the null char if it was added.
    if(decipheredString[decipheredString.Length - 1] == '\0')
        decipheredString = decipheredString.Substring(0, 
                                                decipheredString.Length - 1);
    return decipheredString;
}
The ConvertUIntToString function takes advantage of some shifting and bitwise-anding (&) to convert a 32-bit unsigned integer to a string of length 4. Since a character is 1 byte in length, we can combine 4 characters to make 4 bytes or 32 bits. Gee, that would hold a 32-bit unsigned integer (uint) nicely! Wow!
private string ConvertUIntToString(uint Input)
{
    System.Text.StringBuilder output = new System.Text.StringBuilder();
    output.Append((char)((Input & 0xFF)));
    output.Append((char)((Input >> 8) & 0xFF));
    output.Append((char)((Input >> 16) & 0xFF));
    output.Append((char)((Input >> 24) & 0xFF));
    return output.ToString();
}

Here is the function to undo what ConvertUIntToString does:

private uint ConvertStringToUInt(string Input)
{
    uint output;
    output =  ((uint)Input[0]);
    output += ((uint)Input[1] << 8);
    output += ((uint)Input[2] << 16);
    output += ((uint)Input[3] << 24);
    return output;
}

Anding the shifted Input with 0xFF will cause only 1 byte to be returned.
The sample code includes a sample application for the .NET Framework and the .NET Compact Framework.

Points of Interest

  • The original Tiny Encryption Algorithm can be found here.
  • Another site with some information on this algorithm can be found here.
  • In depth article on TEA framework

History

  • 29 Feb 2004 - Added XTEA Algorithm to the article and source code.
  • 19 Feb 2004 - Original Article.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

pbrooks
Software Developer (Senior)
United States United States
Check out my blog! http://www.pagebrooks.com

You may also be interested in...

Comments and Discussions

 
BugDoesn't work at all Pin
masiton21-Sep-14 5:40
membermasiton21-Sep-14 5:40 
GeneralMy vote of 5 Pin
BlckHwk19-Jun-13 12:13
memberBlckHwk19-Jun-13 12:13 
GeneralArbitrary decode utility Pin
Bug Me Not23-Nov-09 6:36
memberBug Me Not23-Nov-09 6:36 
GeneralFormatKey Pin
ciu221-Oct-09 3:45
memberciu221-Oct-09 3:45 
QuestionÄÜÖ == ? Pin
MixxerY6-Feb-09 3:21
memberMixxerY6-Feb-09 3:21 
AnswerRe: ÄÜÖ == ? Pin
Member 603819613-Aug-09 23:25
memberMember 603819613-Aug-09 23:25 
Questionvery importatnt::: tea encryption with sql server Pin
rashad61212-Dec-07 0:59
memberrashad61212-Dec-07 0:59 
Questionvery importatnt::: tea encryption with sql server Pin
rashad61212-Dec-07 0:58
memberrashad61212-Dec-07 0:58 
Questionsave to XML? Pin
tonypigram17-Nov-06 7:08
membertonypigram17-Nov-06 7:08 
AnswerRe: save to XML? Pin
sandhyas30-Jul-09 0:59
membersandhyas30-Jul-09 0:59 
GeneralMajor Flaw in the algorythm [modified] Pin
jkcode24-Jul-06 8:48
memberjkcode24-Jul-06 8:48 
GeneralRe: Major Flaw in the algorythm Pin
rhinodude3-Dec-06 4:30
memberrhinodude3-Dec-06 4:30 
GeneralRe: Major Flaw in the algorythm Pin
jkcode4-Dec-06 7:38
memberjkcode4-Dec-06 7:38 
GeneralRe: Major Flaw in the algorythm [modified] Pin
Tom Calloway3-Feb-09 3:29
memberTom Calloway3-Feb-09 3:29 
QuestionC++ TEA Implementation? Pin
nemrac986-Jul-06 4:18
membernemrac986-Jul-06 4:18 
GeneralEndianness Pin
D. Emilio Grimaldo Tuñon6-Jul-06 4:08
memberD. Emilio Grimaldo Tuñon6-Jul-06 4:08 
GeneralA suggestion Pin
D. Emilio Grimaldo Tuñon6-Jul-06 2:32
memberD. Emilio Grimaldo Tuñon6-Jul-06 2:32 
Generalproblem Pin
Cyber2217-Apr-06 5:31
memberCyber2217-Apr-06 5:31 
GeneralRe: problem Pin
Jens S4-Feb-08 6:52
memberJens S4-Feb-08 6:52 
GeneralRe: problem Pin
Jens S4-Feb-08 8:50
memberJens S4-Feb-08 8:50 
QuestionVB.NET Implementation Pin
santakdas24-Oct-05 12:37
membersantakdas24-Oct-05 12:37 
AnswerRe: VB.NET Implementation [modified] Pin
meibella17-Jul-07 17:35
membermeibella17-Jul-07 17:35 
AnswerRe: VB.NET Implementation Pin
MatthiasBroschk19-Nov-09 8:21
memberMatthiasBroschk19-Nov-09 8:21 
GeneralVB.NET Implementation Pin
santakdas24-Oct-05 12:35
membersantakdas24-Oct-05 12:35 
GeneralRe: VB.NET Implementation Pin
MatthiasBroschk19-Nov-09 8:22
memberMatthiasBroschk19-Nov-09 8:22 
GeneralMake the functions static Pin
DecksTerrorT23-Feb-05 22:47
memberDecksTerrorT23-Feb-05 22:47 
GeneralWebServices Pin
renatokato24-Nov-04 8:38
memberrenatokato24-Nov-04 8:38 
GeneralVisual Basic Pin
Melanie Jenkins3-Jun-04 19:05
memberMelanie Jenkins3-Jun-04 19:05 
GeneralStream implementation Pin
MarcAdams30-Apr-04 5:54
memberMarcAdams30-Apr-04 5:54 
GeneralHelp needed Pin
sagiflenn21-Apr-04 20:06
membersagiflenn21-Apr-04 20:06 
GeneralWindows Desktop &lt;--&gt;PocketPC Pin
pscode2-Apr-04 9:24
memberpscode2-Apr-04 9:24 
GeneralRe: Windows Desktop &lt;--&gt;PocketPC Pin
WaveRebel9-Jun-04 8:22
memberWaveRebel9-Jun-04 8:22 
QuestionSimpler string &amp; byte encryption ? Pin
Super Lloyd21-Mar-04 17:43
memberSuper Lloyd21-Mar-04 17:43 
AnswerRe: Simpler string &amp; byte encryption ? Pin
SHADYYY29-Apr-07 21:03
memberSHADYYY29-Apr-07 21:03 
GeneralRe: Simpler string &amp; byte encryption ? Pin
SHADYYY6-May-07 8:52
memberSHADYYY6-May-07 8:52 
GeneralCharacters are 2, not 1, bytes Pin
Anonymous9-Mar-04 19:27
sussAnonymous9-Mar-04 19:27 
GeneralRe: Characters are 2, not 1, bytes Pin
pbrooks16-Mar-04 5:51
memberpbrooks16-Mar-04 5:51 
GeneralRe: Characters are 2, not 1, bytes Pin
David Piepgrass27-Sep-04 11:16
memberDavid Piepgrass27-Sep-04 11:16 
GeneralTEA is vulnerable to crypto analysis... Pin
Lars W27-Feb-04 0:01
sussLars W27-Feb-04 0:01 
GeneralRe: TEA is vulnerable to crypto analysis... Pin
pbrooks27-Feb-04 2:25
memberpbrooks27-Feb-04 2:25 
GeneralRe: TEA is vulnerable to crypto analysis... Pin
Anonymous28-Feb-04 12:29
sussAnonymous28-Feb-04 12:29 
As has been pointed out, TEA has a couple of known weaknesses, and even though the attacks aren't very practical it's reason enough to prefer XTEA. However, neither cipher has been analysed as thoroughly as other algorithms. Is the AES (Advanced Encryption Standard) not suitable for this framework?

If you're interested, I've been writing some notes on the TEA/XTEA algorithms recently;

HTML



Matt

GeneralRe: TEA is vulnerable to crypto analysis... Pin
pbrooks29-Feb-04 7:19
memberpbrooks29-Feb-04 7:19 
GeneralRe: TEA is vulnerable to crypto analysis... Pin
Anonymous10-Mar-04 4:28
sussAnonymous10-Mar-04 4:28 
GeneralRe: TEA is vulnerable to crypto analysis... Pin
Anonymous25-Feb-05 4:31
sussAnonymous25-Feb-05 4:31 
GeneralRe: TEA is vulnerable to crypto analysis... Pin
rhinodude3-Dec-06 5:19
memberrhinodude3-Dec-06 5:19 
GeneralRe: TEA is vulnerable to crypto analysis... Pin
rmikaelian30-Jun-05 12:04
memberrmikaelian30-Jun-05 12:04 
QuestionForgot? Pin
Cap'n Code26-Feb-04 3:25
memberCap'n Code26-Feb-04 3:25 
AnswerRe: Forgot? Pin
pbrooks26-Feb-04 16:01
memberpbrooks26-Feb-04 16:01 
GeneralNice, but... Pin
Mitchell2.24v26-Feb-04 2:29
memberMitchell2.24v26-Feb-04 2:29 
GeneralRe: Nice, but... Pin
pbrooks26-Feb-04 16:22
memberpbrooks26-Feb-04 16:22 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150819.1 | Last Updated 1 Mar 2004
Article Copyright 2004 by pbrooks
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid