Beispiel #1
0
 private static void EncryptFile(string filePath, string encryptedFilePath, byte[] salt, byte[] encryptionKey, byte[] macKey)
 {
     try
     {
         using (var ciphertext = new FileStream(encryptedFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read, Constants.FileBufferSize, FileOptions.SequentialScan))
             using (var plaintext = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, Constants.FileBufferSize, FileOptions.SequentialScan))
             {
                 WriteFileHeaders.WriteHeaders(ciphertext, salt);
                 byte[] fileBytes = FileHandling.GetBufferSize(plaintext.Length);
                 // Generate a counter starting at 0
                 byte[] counter = Generate.Counter();
                 int    bytesRead;
                 MemoryEncryption.DecryptByteArray(ref encryptionKey);
                 while ((bytesRead = plaintext.Read(fileBytes, 0, fileBytes.Length)) > 0)
                 {
                     byte[] encryptedBytes = StreamEncryption.EncryptXChaCha20(fileBytes, counter, encryptionKey);
                     ciphertext.Write(encryptedBytes, 0, bytesRead);
                     counter = Sodium.Utilities.Increment(counter);
                 }
             }
         Utilities.ZeroArray(encryptionKey);
         CompleteEncryption(filePath, encryptedFilePath, macKey);
     }
     catch (Exception ex) when(ExceptionFilters.FileEncryptionExceptions(ex))
     {
         Logging.LogException(ex.ToString(), Logging.Severity.High);
         DisplayMessage.Error(filePath, ex.GetType().Name, "Unable to encrypt the file.");
         FileHandling.DeleteFile(encryptedFilePath);
         Utilities.ZeroArray(encryptionKey);
         Utilities.ZeroArray(macKey);
     }
 }
 private static void RestoreDirectoryName(string obfuscatedDirectoryPath)
 {
     try
     {
         string obfuscatedDirectoryName = Path.GetFileName(obfuscatedDirectoryPath);
         // Get the path where the original directory name is stored
         string storageFileName = $"{obfuscatedDirectoryName}.txt";
         string storageFilePath = Path.Combine(obfuscatedDirectoryPath, storageFileName);
         if (!File.Exists(storageFilePath))
         {
             return;
         }
         string directoryName = File.ReadAllText(storageFilePath);
         string directoryPath = obfuscatedDirectoryPath.Replace(obfuscatedDirectoryName, directoryName);
         directoryPath = FileHandling.GetUniqueDirectoryPath(directoryPath);
         Directory.Move(obfuscatedDirectoryPath, directoryPath);
         DisplayMessage.FileEncryptionResult(obfuscatedDirectoryName, directoryName);
         storageFilePath = Path.Combine(directoryPath, storageFileName);
         FileHandling.DeleteFile(storageFilePath);
     }
     catch (Exception ex) when(ExceptionFilters.FileAccess(ex))
     {
         Logging.LogException(ex.ToString(), Logging.Severity.Error);
         DisplayMessage.FilePathException(obfuscatedDirectoryPath, ex.GetType().Name, "Unable to restore the directory name.");
     }
 }
 private static void Finalize(string directoryPath, string saltFilePath)
 {
     if (Globals.SuccessfulCount != 0 && Globals.SuccessfulCount == Globals.TotalCount)
     {
         FileHandling.DeleteFile(saltFilePath);
     }
     Finalize(directoryPath);
 }
Beispiel #4
0
 private static void CompleteDecryption(string filePath, string decryptedFilePath)
 {
     // Deanonymise file name
     OriginalFileName.RestoreOriginalFileName(decryptedFilePath);
     FileHandling.DeleteFile(filePath);
     Console.WriteLine($"{Path.GetFileName(filePath)}: File decryption successful.");
     Globals.SuccessfulCount += 1;
 }
Beispiel #5
0
 private static void Finalize(string directoryPath, string saltFilePath)
 {
     string[] kryptorFiles = Directory.GetFiles(directoryPath, $"*{Constants.EncryptedExtension}", SearchOption.AllDirectories);
     if (kryptorFiles.Length == 0)
     {
         FileHandling.DeleteFile(saltFilePath);
     }
     Finalize(directoryPath);
 }
Beispiel #6
0
 public static void RenameFile(string outputFilePath, int fileNameLength)
 {
     try
     {
         if (fileNameLength == 0)
         {
             return;
         }
         string originalFileName   = ReadFileName(outputFilePath, fileNameLength);
         string obfuscatedFileName = Path.GetFileName(outputFilePath);
         string restoredFilePath   = outputFilePath.Replace(obfuscatedFileName, originalFileName);
         // Replace the file if it already exists
         FileHandling.DeleteFile(restoredFilePath);
         File.Move(outputFilePath, restoredFilePath);
     }
     catch (Exception ex) when(ExceptionFilters.FileAccess(ex))
     {
         Logging.LogException(ex.ToString(), Logging.Severity.Error);
         DisplayMessage.FilePathException(outputFilePath, ex.GetType().Name, "Unable to restore the original file name.");
     }
 }
Beispiel #7
0
        public static void Initialize(FileStream inputFile, string outputFilePath, byte[] ephemeralPublicKey, byte[] keyEncryptionKey)
        {
            var dataEncryptionKey = new byte[Constants.EncryptionKeyLength];

            try
            {
                byte[] encryptedHeader = FileHeaders.ReadEncryptedHeader(inputFile);
                byte[] nonce           = FileHeaders.ReadNonce(inputFile);
                byte[] header          = DecryptFileHeader(inputFile, ephemeralPublicKey, encryptedHeader, nonce, keyEncryptionKey);
                if (header == null)
                {
                    throw new ArgumentException("Incorrect password/key or this file has been tampered with.");
                }
                int lastChunkLength = FileHeaders.GetLastChunkLength(header);
                int fileNameLength  = FileHeaders.GetFileNameLength(header);
                dataEncryptionKey = FileHeaders.GetDataEncryptionKey(header);
                CryptographicOperations.ZeroMemory(header);
                using (var outputFile = new FileStream(outputFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read, Constants.FileStreamBufferSize, FileOptions.SequentialScan))
                {
                    nonce = Utilities.Increment(nonce);
                    byte[] additionalData = ChunkHandling.GetPreviousTag(encryptedHeader);
                    Decrypt(inputFile, outputFile, nonce, dataEncryptionKey, additionalData, lastChunkLength);
                }
                string inputFilePath = inputFile.Name;
                inputFile.Dispose();
                Finalize(inputFilePath, outputFilePath, fileNameLength);
            }
            catch (Exception ex) when(ExceptionFilters.Cryptography(ex))
            {
                CryptographicOperations.ZeroMemory(dataEncryptionKey);
                if (!(ex is ArgumentException))
                {
                    FileHandling.DeleteFile(outputFilePath);
                }
                throw;
            }
        }
Beispiel #8
0
 public static void Initialize(string inputFilePath, string outputFilePath, byte[] ephemeralPublicKey, byte[] salt, byte[] keyEncryptionKey)
 {
     byte[] dataEncryptionKey = Generate.DataEncryptionKey();
     try
     {
         using (var inputFile = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, Constants.FileStreamBufferSize, FileOptions.SequentialScan))
             using (var outputFile = new FileStream(outputFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read, Constants.FileStreamBufferSize, FileOptions.SequentialScan))
             {
                 byte[] nonce           = Generate.Nonce();
                 byte[] encryptedHeader = EncryptFileHeader(inputFilePath, dataEncryptionKey, nonce, keyEncryptionKey);
                 FileHeaders.WriteHeaders(outputFile, ephemeralPublicKey, salt, nonce, encryptedHeader);
                 nonce = Sodium.Utilities.Increment(nonce);
                 byte[] additionalData = ChunkHandling.GetPreviousPoly1305Tag(encryptedHeader);
                 Encrypt(inputFile, outputFile, nonce, dataEncryptionKey, additionalData);
             }
         Finalize(inputFilePath, outputFilePath);
     }
     catch (Exception ex) when(ExceptionFilters.Cryptography(ex))
     {
         FileHandling.DeleteFile(outputFilePath);
         Utilities.ZeroArray(dataEncryptionKey);
         throw;
     }
 }
Beispiel #9
0
 private static void Finalize(string inputFilePath, string outputFilePath, int fileNameLength)
 {
     RestoreFileName.RenameFile(outputFilePath, fileNameLength);
     FileHandling.DeleteFile(inputFilePath);
 }