protected virtual string EncryptName(string name)
        {
            var bytes = Encoding.UTF8.GetBytes(name);

            var aesVersion = FileSystem.Version;

            using (var aes = CreateAes(aesVersion))
            {
                var iv = aes.IV;

                var key = FileSystem.ComputeKey(iv, aesVersion);
                using (var tranform = aes.CreateEncryptor(key, iv))
                {
                    using (var outputStream = new MemoryStream())
                    {
                        var aesHeader = new AesHeader(aesVersion, iv);
                        aesHeader.Write(outputStream);

                        var encryptedBytes = tranform.TransformFinalBlock(bytes, 0, bytes.Length);
                        outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);

                        return(Convert.ToBase64String(outputStream.ToArray()).Replace('/', '-'));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public async Task <IFileInfo> CreateFileAsync(string name, Stream stream, long length, CancellationToken ct)
        {
            if (FileSystem.EncryptFileName)
            {
                name = EncryptName(name);
            }

            using (var aes = CreateAes(FileSystem.Version))
            {
                using (var headerStream = new MemoryStream())
                {
                    var aesHeader = new AesHeader(FileSystem.Version, aes.IV);
                    aesHeader.Write(headerStream);
                    headerStream.Seek(0, SeekOrigin.Begin);

                    var key = FileSystem.ComputeKey(aes.IV, FileSystem.Version);
                    ICryptoTransform encryptor = CreateTransform(aes, key, aes.IV, AesMode.Encrypt);
                    using (var cryptoStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Read))
                        using (var concat = new StreamEnumerator(new Stream[] { headerStream, cryptoStream }, true))
                        {
                            var fileInfo = await _directoryInfo.CreateFileAsync(name, concat, length, ct).ConfigureAwait(false);

                            return(new AesFileInfo(FileSystem, fileInfo));
                        }
                }
            }
        }