private Stream GetReadMemoryStream(string filePath, string password) { var decryptedMemoryStream = new MemoryStream(); //TODO: MemoryStream or temporary decrypted file on disk? var metadata = EncryptionFactory.GetMetadata(); metadata.Initialize(password); var fileStream = File.OpenRead(filePath); if (!metadata.TryReadFromStream(fileStream, Version)) { decryptedMemoryStream.Close(); fileStream.Seek(0, SeekOrigin.Begin); return(fileStream); } metadata.ComputeAndValidateHmacHash(fileStream); using (var algorithm = metadata.GetCryptographyAlgorithm()) { using var transform = algorithm.CreateDecryptor(); using var cryptoStream = new CryptoStreamWrapper(fileStream, transform, CryptoStreamMode.Read); cryptoStream.CopyTo(decryptedMemoryStream); cryptoStream.Close(); } fileStream.Close(); decryptedMemoryStream.Seek(0, SeekOrigin.Begin); return(decryptedMemoryStream); }
private void DecryptFile(string filePath, string password) { var fileInfo = new FileInfo(filePath); if (fileInfo.IsReadOnly) { fileInfo.IsReadOnly = false; } var decryptedFilePath = GetUniqFileName(filePath, ".dec"); try { var metadata = EncryptionFactory.GetMetadata(); metadata.Initialize(password); using (var fileStream = File.OpenRead(filePath)) { if (!metadata.TryReadFromStream(fileStream, Version)) { return; } metadata.ComputeAndValidateHmacHash(fileStream); using (var decryptedFileStream = new FileStream(decryptedFilePath, FileMode.Create)) { using (var algorithm = metadata.GetCryptographyAlgorithm()) { using (var transform = algorithm.CreateDecryptor()) { using (var cryptoStream = new CryptoStreamWrapper(decryptedFileStream, transform, CryptoStreamMode.Write)) { fileStream.CopyTo(cryptoStream); cryptoStream.FlushFinalBlock(); cryptoStream.Close(); } } } decryptedFileStream.Close(); } fileStream.Close(); } ReplaceFile(decryptedFilePath, filePath); } catch (Exception exception) { if (File.Exists(decryptedFilePath)) { File.Delete(decryptedFilePath); } throw exception; } }
private void EncryptFile(string filePath, string password) { var fileInfo = new FileInfo(filePath); if (fileInfo.IsReadOnly) { fileInfo.IsReadOnly = false; } var ecryptedFilePath = GetUniqFileName(filePath, ".enc"); try { var metadata = EncryptionFactory.GetMetadata(); metadata.Initialize(Version, password, fileInfo.Length); using (var ecryptedFileStream = new FileStream(ecryptedFilePath, FileMode.Create)) { metadata.WriteToStream(ecryptedFileStream); using (var algorithm = metadata.GetCryptographyAlgorithm()) { using var transform = algorithm.CreateEncryptor(); using var cryptoStream = new CryptoStreamWrapper(ecryptedFileStream, transform, CryptoStreamMode.Write); using (var fileStream = File.OpenRead(filePath)) { fileStream.CopyTo(cryptoStream); fileStream.Close(); } cryptoStream.FlushFinalBlock(); metadata.ComputeAndWriteHmacHash(ecryptedFileStream); cryptoStream.Close(); } ecryptedFileStream.Close(); } ReplaceFile(ecryptedFilePath, filePath); } catch (Exception exception) { if (File.Exists(ecryptedFilePath)) { File.Delete(ecryptedFilePath); } throw exception; } }