⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtea.cs

📁 很好用的一个C#编写的精巧的加解密算法源码。
💻 CS
字号:
using System;

namespace TeaCrypto
{
	/// <summary>
	/// Summary description for XTea.
	/// </summary>
	public class XTea
	{
		// Ctor
		public XTea()
		{
		}

		public string EncryptString(string Data, string Key)
		{
			if(Data.Length == 0)
				throw new ArgumentException("Data must be at least 1 character in length.");

			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 += Util.ConvertUIntToString(tempData[0]) + Util.ConvertUIntToString(tempData[1]);
			}
			
			return cipher;
		}

		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] = Util.ConvertStringToUInt(Data.Substring(i, 4));
				tempData[1] = Util.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);
			if(decipheredString[decipheredString.Length - 1] == '\0')
				decipheredString = decipheredString.Substring(0, decipheredString.Length - 1);
			return decipheredString;
		}

		public uint[] FormatKey(string Key)
		{
			if(Key.Length == 0)
				throw new ArgumentException("Key must be between 1 and 16 characters in length");

			Key = Key.PadRight(16,' ').Substring(0, 16); // Ensure that the key is 16 chars in length.
			uint[] formattedKey = new uint[4];

			// Get the key into the correct format for TEA usage.
			int j = 0;
			for(int i=0; i<Key.Length; i+=4)
				formattedKey[j++] = Util.ConvertStringToUInt(Key.Substring(i, 4));

			return formattedKey;
		}

		#region XTea Algorithm
		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;
		}

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

			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;
		}
		#endregion

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -