示例#1
0
        public static byte[] Handle(PeerChatCTX ctx, byte[] data)
        {
            byte        num1 = ctx.Buffer1;
            byte        num2 = ctx.Buffer2;
            byte        t;
            int         datapos = 0;
            List <byte> buffer  = new List <byte>();
            long        size    = data.Length;

            while (size-- > 0)
            {
                num1           = (byte)((num1 + 1) % 256);
                num2           = (byte)((ctx.SBox[num1] + num2) % 256);
                t              = ctx.SBox[num1];
                ctx.SBox[num1] = ctx.SBox[num2];
                ctx.SBox[num2] = t;
                t              = (byte)((ctx.SBox[num2] + ctx.SBox[num1]) % 256);
                byte temp = (byte)(data[datapos++] ^ ctx.SBox[t]);
                buffer.Add(temp);
            }

            ctx.Buffer1 = num1;
            ctx.Buffer2 = num2;
            return(buffer.ToArray());
        }
示例#2
0
 public ChatCrypt(string gameSecretKey)
 {
     ClientCtx = new PeerChatCTX();
     ServerCtx = new PeerChatCTX();
     Init(ClientCtx, ClientKey, gameSecretKey);
     Init(ServerCtx, ServerKey, gameSecretKey);
 }
示例#3
0
        /// <summary>
        /// Prepare the key
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="chall"></param>
        /// <param name="gamekey"></param>
        public static void Init(PeerChatCTX ctx, string challengeKey, string secretKey)
        {
            byte[] challengeBytes = UniSpyEncoding.GetBytes(challengeKey);
            byte[] secretKeyBytes = UniSpyEncoding.GetBytes(secretKey);

            ctx.Buffer1 = 0;
            ctx.Buffer2 = 0;

            int secretKeyIndex = 0;

            for (int i = 0; i < challengeBytes.Length; i++, secretKeyIndex++)
            {
                if (secretKeyIndex >= secretKeyBytes.Length)
                {
                    secretKeyIndex = 0;
                }

                challengeBytes[i] ^= secretKeyBytes[secretKeyIndex];
            }

            byte index1 = 255;

            for (int i = 0; i < 256; i++, index1--)
            {
                ctx.SBox[i] = index1;
            }

            index1 = 0;

            for (int i = 0, index2 = 0; i < ctx.SBox.Length; i++, index1++)
            {
                if (index1 >= challengeBytes.Length)
                {
                    index1 = 0;
                }

                index2 = (byte)((challengeBytes[index1] + ctx.SBox[i] + index2) % 256);
                byte t = ctx.SBox[i];
                ctx.SBox[i]      = ctx.SBox[index2];
                ctx.SBox[index2] = t;
            }
        }