求C语言加密XXTEA算法和C# XXtea算法 通用

上线就吃代码 2013-09-06 11:02:14
C语言发过来的数据经过加密后 发到C#软件里解密,C#加密后发到C 解密
...全文
183 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
keke505 2013-09-16
  • 打赏
  • 举报
回复
这个涉及到大端小端模式的问题,必须要转换
上线就吃代码 2013-09-13
  • 打赏
  • 举报
回复
能不能直接给出Demo例子,这些代码根本没用处
citycal 2013-09-06
  • 打赏
  • 举报
回复
//c#实现
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;
	}
}
//XXTEA算法的C语言表达:
//以下算法描述中,v表示为运算的长整型数据的首地址,k为长整型的密钥的首地址,n表示要要运算的组元个数,正表示加密,负表示解密。N是以32bit为基本单位的组元个数。
#define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);
long btea(long* v, long n, long* k)
{
	unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
	long p, q;
	if (n > 1)
	{
		/* 加密过程 */
		q = 6 + 52/n;
		while (q-- > 0)
		{
			sum += DELTA;
			e = (sum >> 2) & 3;
			for (p=0; p<n-1; p++)
				y = v[p+1],z = v[p] += MX;
			y = v[0];
			z = v[n-1] += MX;
		}
        return 0 ;
    }
	else if (n < -1)
	{
		/* 解密过程 */
		n = -n;
		q = 6 + 52/n;
		sum = q*DELTA;
        while(sum != 0)
		{
			e = (sum >> 2) & 3;
			for (p=n-1; p>0; p--)
				z = v[p-1], y = v[p] -= MX;
			z = v[n-1]; y = v[0] -= MX;
			sum -= DELTA;
		}
		return 0;
	}
	return 1;
}
citycal 2013-09-06
  • 打赏
  • 举报
回复
//c#实现 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; } } //XXTEA算法的C语言表达: //以下算法描述中,v表示为运算的长整型数据的首地址,k为长整型的密钥的首地址,n表示要要运算的组元个数,正表示加密,负表示解密。N是以32bit为基本单位的组元个数。 #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z); long btea(long* v, long n, long* k) { unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9; long p, q; if (n > 1) { /* 加密过程 */ q = 6 + 52/n; while (q-- > 0) { sum += DELTA; e = (sum >> 2) & 3; for (p=0; p<n-1; p++) y = v[p+1],z = v[p] += MX; y = v[0]; z = v[n-1] += MX; } return 0 ; } else if (n < -1) { /* 解密过程 */ n = -n; q = 6 + 52/n; sum = q*DELTA; while(sum != 0) { e = (sum >> 2) & 3; for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX; z = v[n-1]; y = v[0] -= MX; sum -= DELTA; } return 0; } return 1; }

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧