Esempio n. 1
0
        /// <summary>
        /// Отправляет клиенту файл, предварительно расшифровывая его
        /// </summary>
        /// <param name="fileName">Путь до файла</param>
        /// <param name="key">Ключ шифрования</param>
        /// <returns></returns>
        public bool SendEncryptedFile(string fileName, string key)
        {
            if (!File.Exists(fileName))
            {
                return(false);
            }
            _cryptoController.Key = key;
            var byteFormatter = new BinaryFormatter();

            using (var fs = new FileStream(fileName, FileMode.Open))
            {
                while (fs.Position != fs.Length)
                {
                    var bytes =
                        new byte[fs.Length - fs.Position > BufferLength ? BufferLength : fs.Length - fs.Position];
                    var bytesCount = fs.Read(bytes, 0, bytes.Length);

                    //Криптографические преобразования над массивом байт
                    bytes = _cryptoController.GostDecryptBytes(bytes);
                    if (fs.Position == fs.Length)
                    {
                        var subBytesCount = bytes.Last() + 8;
                        var lastBytes     = new byte[bytes.Length - subBytesCount];
                        Array.Copy(bytes, lastBytes, bytes.Length - subBytesCount);
                        bytes = lastBytes;
                    }
                    //

                    byteFormatter.Serialize(_stream, bytes);
                }
            }
            var endFileBytes = new byte[CheckBufferSize];

            for (var i = 0; i < endFileBytes.Length; i++)
            {
                endFileBytes[i] = Byte.MaxValue;
            }
            byteFormatter.Serialize(_stream, endFileBytes);
            return(true);
        }