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); }
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); }