Ejemplo n.º 1
0
        public static bool ReadAndDecryptPacket(BinaryReader srcStreamReader, MemoryStream destStream, SymmetricAlgorithm alg)
        {
            destStream.SetLength(0);

            //int tmout = srcStreamReader.BaseStream.ReadTimeout;
            if (srcStreamReader.ReadChar() != 'P')
            {
                return(false);
            }
            int len = srcStreamReader.ReadInt32();

            if (len > MaxInPacketLength)
            {
                return(false);
            }
            int iv = srcStreamReader.ReadInt32() - 200;

            byte[] buf = srcStreamReader.ReadBytes(len - 8);
            uint   crc = srcStreamReader.ReadUInt32() - 200;

            if (CRCGenerator.CRC32(buf, 0, buf.Length, CRCSeed) != crc)
            {
                return(false);
            }

            alg.IV = Encoding.ASCII.GetBytes(iv.ToString("X8"));
            MemoryStream tmpStream = new MemoryStream(buf);

            Crypto.Decrypt(tmpStream, destStream, alg, 64);

            destStream.Position = 0;
            return(true);
        }
Ejemplo n.º 2
0
        public static bool EncryptAndWritePacket(BinaryWriter destStreamWriter, MemoryStream srcStream, SymmetricAlgorithm alg)
        {
            if (srcStream.Length == 0)
            {
                return(true);
            }

            int iv = GetRandom();

            alg.IV = Encoding.ASCII.GetBytes(iv.ToString("X8"));

            MemoryStream tmpStream = new MemoryStream();
            CryptoStream encStream = new CryptoStream(tmpStream, alg.CreateEncryptor(), CryptoStreamMode.Write);

            encStream.Write(srcStream.GetBuffer(), 0, (int)srcStream.Length);
            encStream.FlushFinalBlock();

            destStreamWriter.Write('P');
            destStreamWriter.Write((Int32)(tmpStream.Length + 8));
            destStreamWriter.Write(iv + 200);

            int offset = 0;

            while (offset < tmpStream.Length)
            {
                int l = (int)tmpStream.Length - offset;
                if (l > 4096)
                {
                    l = 4096;
                }
                destStreamWriter.Write(tmpStream.GetBuffer(), offset, l);
                destStreamWriter.BaseStream.Flush();
                offset += l;
            }

            destStreamWriter.Write(CRCGenerator.CRC32(tmpStream.GetBuffer(), 0, (int)tmpStream.Length, CRCSeed) + 200);

            encStream.Close();
            return(true);
        }