コード例 #1
0
        /*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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        /*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;
                }
            }
        }