Aegis.Network.SecurePacket.Encrypt C# (CSharp) Method

Encrypt() public method

public Encrypt ( string iv, string key ) : void
iv string
key string
return void
        public virtual void Encrypt(string iv, string key)
        {
            //  Padding
            {
                int paddingByte, blockSizeInByte = 16;

                //  (Size - 2) = Encrypt data size
                //  -4 = CRC data
                paddingByte = blockSizeInByte - (Size - 2) % blockSizeInByte - 4;
                if (paddingByte < 0)
                    paddingByte = blockSizeInByte + paddingByte;

                if (paddingByte > 0)
                    Write(_tempBuffer, 0, paddingByte);
            }

            //  CRC
            {
                uint crc = GetCRC32(Buffer, 2, Size - 2);
                PutUInt32(crc);
            }

            //  Encrypt
            using (Aes aes = Aes.Create())
            using (MemoryStream memoryStream = new MemoryStream())
            {
                aes.Mode = CipherMode.CBC;
                aes.Padding = PaddingMode.None;
                aes.KeySize = 128;
                aes.BlockSize = 128;
                aes.Key = Encoding.ASCII.GetBytes(key);
                aes.IV = Encoding.ASCII.GetBytes(iv);

                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    ushort packetSize = Size;

                    cryptoStream.Write(Buffer, 2, packetSize - 2);
                    byte[] encrypted = memoryStream.ToArray();
                    Overwrite(encrypted, 0, encrypted.Length, 2);

                    cryptoStream.Close();
                }

                memoryStream.Close();
            }
        }

Usage Example

Beispiel #1
0
        private void OnAccepted(Session session)
        {
            //  초기화
            _user = null;

            //  각 8비트마다 0이 나오지 않는 임의 숫자 생성
            Int32 seed = 0;
            seed |= Randomizer.NextNumber(1, 255) << 24;
            seed |= Randomizer.NextNumber(1, 255) << 16;
            seed |= Randomizer.NextNumber(1, 255) << 8;
            seed |= Randomizer.NextNumber(1, 255);

            //  패킷 암호화 키 생성
            {
                String characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
                char[] ascii = new char[16];

                for (Int32 i = 0; i < 16; ++i)
                {
                    Int32 val = seed & (0x6E << i);
                    ascii[i] = characterSet[(val % characterSet.Length)];
                }
                _aesIV = new String(ascii);

                for (Int32 i = 0; i < 16; ++i)
                {
                    Int32 val = seed & (0xF4 << i);
                    ascii[i] = characterSet[(val % characterSet.Length)];
                }
                _aesKey = new String(ascii);
            }

            SecurePacket ntfPacket = new SecurePacket(Protocol.GetID("CS_Hello_Ntf"));
            ntfPacket.PutInt32(ResultCode.Ok);
            ntfPacket.PutInt32((Int32)ServerType.GameServer);
            ntfPacket.PutInt32(seed);
            ntfPacket.Encrypt(ServerMain.AES_IV, ServerMain.AES_Key);
            base.SendPacket(ntfPacket);
        }