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('/', '-')); } } } }
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)); } } } }