/// <summary>
        /// Encrypt data using MapleStory's AES method
        /// </summary>
        /// <param name="IV">IV to use for encryption</param>
        /// <param name="data">data to encrypt</param>
        /// <param name="length">length of data</param>
        /// <param name="key">the AES key to use</param>
        /// <returns>Crypted data</returns>
        public static byte[] AESCrypt(byte[] IV, byte[] data, int length, byte[] key)
        {
            AesManaged crypto = new AesManaged {
                KeySize = 256,           //in bits
                Key     = key,
                Mode    = CipherMode.ECB // Should be OFB, but this works too
            };

            MemoryStream memStream    = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memStream, crypto.CreateEncryptor(), CryptoStreamMode.Write);

            int remaining = length;
            int llength   = 0x5B0;
            int start     = 0;

            while (remaining > 0)
            {
                byte[] myIV = MapleCrypto.multiplyBytes(IV, 4, 4);
                if (remaining < llength)
                {
                    llength = remaining;
                }
                for (int x = start; x < (start + llength); x++)
                {
                    if ((x - start) % myIV.Length == 0)
                    {
                        cryptoStream.Write(myIV, 0, myIV.Length);
                        byte[] newIV = memStream.ToArray();
                        Array.Copy(newIV, myIV, myIV.Length);
                        memStream.Position = 0;
                    }
                    data[x] ^= myIV[(x - start) % myIV.Length];
                }
                start     += llength;
                remaining -= llength;
                llength    = 0x5B4;
            }

            try
            {
                cryptoStream.Dispose();
                memStream.Dispose();
            }
            catch (Exception e)
            {
                Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "Error disposing AES streams" + e);
                //Console.WriteLine("Error disposing AES streams" + e);
            }

            return(data);
        }
Example #2
0
        /// <summary>
        /// Encrypt data using MapleStory's AES method
        /// </summary>
        /// <param name="pIV">IV to use for encryption</param>
        /// <param name="pData">data to encrypt</param>
        /// <param name="pLength">length of data</param>
        /// <param name="pKey">the AES key to use</param>
        /// <returns>Crypted data</returns>
        public static byte[] aesCrypt(byte[] pIV, byte[] pData, int pLength, byte[] pKey)
        {
            AesManaged crypto = new AesManaged {
                KeySize = 256, Key = pKey, Mode = CipherMode.ECB
            };

            MemoryStream memStream    = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memStream, crypto.CreateEncryptor(), CryptoStreamMode.Write);

            int remaining = pLength;
            int llength   = 0x5B0;
            int start     = 0;

            while (remaining > 0)
            {
                byte[] myIV = MapleCrypto.multiplyBytes(pIV, 4, 4);
                if (remaining < llength)
                {
                    llength = remaining;
                }
                for (int x = start; x < (start + llength); x++)
                {
                    if ((x - start) % myIV.Length == 0)
                    {
                        cryptoStream.Write(myIV, 0, myIV.Length);
                        byte[] newIV = memStream.ToArray();
                        Array.Copy(newIV, myIV, myIV.Length);
                        memStream.Position = 0;
                    }
                    pData[x] ^= myIV[(x - start) % myIV.Length];
                }
                start     += llength;
                remaining -= llength;
                llength    = 0x5B4;
            }

            try {
                cryptoStream.Dispose();
                memStream.Dispose();
            } catch (Exception e) {
                Console.WriteLine("Error disposing AES streams" + e);
            }

            return(pData);
        }