/*pOutBuffer、pInBuffer均为8char, pKey为16char*/ static void TeaEncryptECB(TeaEncTempBuffer encTempBuffer, byte[] pInBuf, int inBufPos, byte[] pKey, byte[] pOutBuf, int outBufIndex) { uint y, z; uint sum; uint[] k = encTempBuffer.enc_k; int i; y = (uint)System.BitConverter.ToInt32(pInBuf, 0); z = (uint)System.BitConverter.ToInt32(pInBuf, 4); for (i = 0; i < 4; i++) { k[i] = (uint)System.BitConverter.ToInt32(pKey, i * 4); } sum = 0; for (i = 0; i < ROUNDS; i++) { sum += DELTA; y += ((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1]); z += ((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3]); } IntToBytes((int)y, pOutBuf, outBufIndex); IntToBytes((int)z, pOutBuf, outBufIndex + 4); }
public static void Test() { System.IO.MemoryStream m = new System.IO.MemoryStream(); var b = new System.IO.BinaryWriter(m); for (int i = 0; i < 512; i++) { b.Write((byte)1); b.Write((byte)2); } var buffs = m.GetBuffer(); var index = m.Position; byte[] bs = new byte[index]; for (int i = 0; i < bs.Length; i++) { bs[i] = buffs[i]; } int buffLen = bs.Length; int tempCount = 0; var encBuff = new TeaEncTempBuffer(); var tempBuff = new byte[1420]; NetworkCryptologyUtil.TeaEncrypt(encBuff, bs, buffLen, TestKey, tempBuff, ref tempCount); System.Console.WriteLine(tempCount); System.Console.WriteLine(tempBuff); var data1 = tempBuff.Take(tempCount).ToArray(); tempCount = data1.Length; var decBuff = new TeaDecTempBuffer(); var tempBuff1 = new byte[1420]; NetworkCryptologyUtil.TeaDecrypt(decBuff, data1, tempCount, TestKey, tempBuff1, ref tempCount); System.Console.WriteLine(tempCount); System.Console.WriteLine(tempBuff1); }
/*pKey为16char*/ /* * 输入:pInBuf为需加密的明文部分(Body),nInBufLen为pInBuf长度; * 输出:pOutBuf为密文格式,pOutBufLen为pOutBuf的长度是8char的倍数; */ /*TEA加密算法,CBC模式*/ /*密文格式:PadLen(1char)+Padding(var,0-7char)+Salt(2char)+Body(var char)+Zero(7char)*/ public static void TeaEncrypt(TeaEncTempBuffer encTempBuffer, byte[] pInBuf, int nInBufLen, byte[] pKey, byte[] pOutBuf, ref int pOutBufLen) { int nPadSaltBodyZeroLen /*PadLen(1char)+Salt+Body+Zero的长度*/; int nPadlen; byte[] src_buf = encTempBuffer.enc_src_buf; byte[] iv_plain = encTempBuffer.enc_iv_plain; byte[] iv_crypt = encTempBuffer.enc_iv_crypt; int src_i, i, j; int outBufPos = 0; /*根据Body长度计算PadLen,最小必需长度必需为8char的整数倍*/ nPadSaltBodyZeroLen = nInBufLen /*Body长度*/ + 1 + SALT_LEN + ZERO_LEN /*PadLen(1char)+Salt(2char)+Zero(7char)*/; nPadlen = nPadSaltBodyZeroLen % 8; if (0 != nPadlen) /*len=nSaltBodyZeroLen%8*/ { /*模8余0需补0,余1补7,余2补6,...,余7补1*/ nPadlen = 8 - nPadlen; } /*srand( (unsigned)time( NULL ) ); 初始化随机数*/ /*加密第一块数据(8char),取前面10char*/ src_buf[0] = (byte)((((byte)(rand()) & 0x0f8 /*最低三位存PadLen,清零*/) | nPadlen)); src_i = 1; /*src_i指向src_buf下一个位置*/ while (nPadlen-- > 0) { src_buf[src_i++] = (byte)rand(); /*Padding*/ } /*come here, src_i must <= 8*/ for (i = 0; i < 8; i++) { iv_plain[i] = 0; } System.Buffer.BlockCopy(iv_plain, 0, iv_crypt, 0, 8); pOutBufLen = 0; /*init OutBufLen*/ for (i = 1; i <= SALT_LEN;) /*Salt(2char)*/ { if (src_i < 8) { src_buf[src_i++] = (byte)rand(); i++; /*i inc in here*/ } if (src_i == 8) { /*src_i==8*/ for (j = 0; j < 8; j++) /*加密前异或前8个char的密文(iv_crypt指向的)*/ { src_buf[j] ^= iv_crypt[j]; } /*pOutBuffer、pInBuffer均为8char, pKey为16char*/ /*加密*/ TeaEncryptECB(encTempBuffer, src_buf, 0, pKey, pOutBuf, outBufPos); for (j = 0; j < 8; j++) /*加密后异或前8个char的明文(iv_plain指向的)*/ { pOutBuf[j + outBufPos] ^= iv_plain[j]; } /*保存当前的iv_plain*/ for (j = 0; j < 8; j++) { iv_plain[j] = src_buf[j]; } /*更新iv_crypt*/ src_i = 0; System.Buffer.BlockCopy(pOutBuf, outBufPos, iv_crypt, 0, 8); pOutBufLen += 8; outBufPos += 8; } } int inBufPos = 0; /*src_i指向src_buf下一个位置*/ while (nInBufLen > 0) { if (src_i < 8) { src_buf[src_i++] = pInBuf[inBufPos++]; nInBufLen--; } if (src_i == 8) { /*src_i==8*/ for (j = 0; j < 8; j++) /*加密前异或前8个char的密文(iv_crypt指向的)*/ { src_buf[j] ^= iv_crypt[j]; } /*pOutBuffer、pInBuffer均为8char, pKey为16char*/ TeaEncryptECB(encTempBuffer, src_buf, 0, pKey, pOutBuf, outBufPos); for (j = 0; j < 8; j++) /*加密后异或前8个char的明文(iv_plain指向的)*/ { pOutBuf[outBufPos + j] ^= iv_plain[j]; } /*保存当前的iv_plain*/ for (j = 0; j < 8; j++) { iv_plain[j] = src_buf[j]; } src_i = 0; System.Buffer.BlockCopy(pOutBuf, outBufPos, iv_crypt, 0, 8); pOutBufLen += 8; outBufPos += 8; } } /*src_i指向src_buf下一个位置*/ for (i = 1; i <= ZERO_LEN;) { if (src_i < 8) { src_buf[src_i++] = 0; i++; /*i inc in here*/ } if (src_i == 8) { /*src_i==8*/ for (j = 0; j < 8; j++) /*加密前异或前8个char的密文(iv_crypt指向的)*/ { src_buf[j] ^= iv_crypt[j]; } /*pOutBuffer、pInBuffer均为8char, pKey为16char*/ TeaEncryptECB(encTempBuffer, src_buf, 0, pKey, pOutBuf, outBufPos); for (j = 0; j < 8; j++) /*加密后异或前8个char的明文(iv_plain指向的)*/ { pOutBuf[j + outBufPos] ^= iv_plain[j]; } /*保存当前的iv_plain*/ for (j = 0; j < 8; j++) { iv_plain[j] = src_buf[j]; } src_i = 0; System.Buffer.BlockCopy(pOutBuf, outBufPos, iv_crypt, 0, 8); pOutBufLen += 8; outBufPos += 8; } } }