C#中的XXTEA算法 XXTEA加密解密算法

XXTEA加密解密算法

使用方法:

       System.Text.Encoding encoder = System.Text.Encoding.Default;
       Byte[] data1 = xxtea.Encrypt(encoder.GetBytes("admin"), encoder.GetBytes("xiaoyao")); //加密数据
       Byte[] data2 = xxtea.Decrypt(System.Convert.FromBase64String("mXjv7U5dUl1aMTVV"), encoder.GetBytes("xiaoyao")); //解密数据
       System.Convert.ToBase64String(data1) //加密后的数据进行base64转换

       encoder.GetString(data2));  //解密后的数据转换为字符串

CODE:

public class xxtea
{

    public static Byte[] Encrypt(Byte[] Data, Byte[] Key)
    {

        if (Data.Length == 0)
        {

            return Data;

        }

        return ToByteArray(Encrypt(ToUInt32Array(Data, true), ToUInt32Array(Key, false)), false);

    }

    public static Byte[] Decrypt(Byte[] Data, Byte[] Key)
    {

        if (Data.Length == 0)
        {

            return Data;

        }

        return ToByteArray(Decrypt(ToUInt32Array(Data, false), ToUInt32Array(Key, false)), true);

    }

    public static UInt32[] Encrypt(UInt32[] v, UInt32[] k)
    {

        Int32 n = v.Length – 1;

        if (n < 1)
        {

            return v;

        }

        if (k.Length < 4)
        {

            UInt32[] Key = new UInt32[4];

            k.CopyTo(Key, 0);

            k = Key;

        }

        UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum = 0, e;

        Int32 p, q = 6 + 52 / (n + 1);

        while (q– > 0)
        {

            sum = unchecked(sum + delta);

            e = sum >> 2 & 3;

            for (p = 0; p < n; p++)
            {

                y = v[p + 1];

                z = unchecked(v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));

            }

            y = v[0];

            z = unchecked(v[n] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));

        }

        return v;

    }

    public static UInt32[] Decrypt(UInt32[] v, UInt32[] k)
    {

        Int32 n = v.Length – 1;

        if (n < 1)
        {

            return v;

        }

        if (k.Length < 4)
        {

            UInt32[] Key = new UInt32[4];

            k.CopyTo(Key, 0);

            k = Key;

        }

        UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum, e;

        Int32 p, q = 6 + 52 / (n + 1);

        sum = unchecked((UInt32)(q * delta));

        while (sum != 0)
        {

            e = sum >> 2 & 3;

            for (p = n; p > 0; p–)
            {

                z = v[p – 1];

                y = unchecked(v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));

            }

            z = v[n];

            y = unchecked(v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));

            sum = unchecked(sum – delta);

        }

        return v;

    }

    private static UInt32[] ToUInt32Array(Byte[] Data, Boolean IncludeLength)
    {

        Int32 n = (((Data.Length & 3) == 0) ? (Data.Length >> 2) : ((Data.Length >> 2) + 1));

        UInt32[] Result;

        if (IncludeLength)
        {

            Result = new UInt32[n + 1];

            Result[n] = (UInt32)Data.Length;

        }

        else
        {

            Result = new UInt32[n];

        }

        n = Data.Length;

        for (Int32 i = 0; i < n; i++)
        {

            Result[i >> 2] |= (UInt32)Data[i] << ((i & 3) << 3);

        }

        return Result;

    }

    private static Byte[] ToByteArray(UInt32[] Data, Boolean IncludeLength)
    {

        Int32 n;

        if (IncludeLength)
        {

            n = (Int32)Data[Data.Length – 1];

        }

        else
        {

            n = Data.Length << 2;

        }

        Byte[] Result = new Byte[n];

        for (Int32 i = 0; i < n; i++)
        {

            Result[i] = (Byte)(Data[i >> 2] >> ((i & 3) << 3));

        }

        return Result;

    } 

}

发表评论

您的电子邮箱地址不会被公开。