C # пытается расшифровать файл только для обработки памяти

Я пытаюсь дешифровать файл ТОЛЬКО памяти процесса. Я не хочу, чтобы фактический файл отправлялся в обычный текст, поскольку он будет хранить конфиденциальные данные. Я не хочу, чтобы сырой текст сидел в системе.

В настоящее время я тестирую файл eula в C: BUT, получаю ту же проблему независимо от того, какой файл я использую.

Я использую AES с засолением. Расшифровка файла работает как сейчас. Я деинсталлировал дешифрованные данные в текстовый документ, но когда я пытаюсь скомпилировать decrpytedBytes в строку, он выводит только 3 символа, которые не существуют в этом порядке в любом месте документа.

https://i.imgur.com/WAQ2njB.png

Эти 2 символа отображаются при использовании System.Text.Encoding.UTF8.GetString(bytesDecrypted, 0, bytesDecrypted.Length) для компиляции массива байтов в строку.

Я попробовал только базовый .ToString() но вернул System.Byte[] и ничего больше

https://i.imgur.com/Gg5Et72.png

При использовании var str = System.Text.Encoding.Default.GetString(bytesDecrypted) он выводит только ÿþ *

https://i.imgur.com/94hMuB3.png

Вот код, который я использую для шифрования и дешифрования

 public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
 {
     byte[] encryptedBytes = null;
     byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

     using (MemoryStream ms = new MemoryStream())
     {
          using (RijndaelManaged AES = new RijndaelManaged())
          {
              AES.KeySize = 256;
              AES.BlockSize = 128;

              var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
              AES.Key = key.GetBytes(AES.KeySize / 8);
              AES.IV = key.GetBytes(AES.BlockSize / 8);
              AES.Mode = CipherMode.CBC;

              using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
              {
                   cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                   cs.Close();
              }

              encryptedBytes = ms.ToArray();
          }
     }

     return encryptedBytes;
 }

 public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
 {
     byte[] decryptedBytes = null;
     byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

     using (MemoryStream ms = new MemoryStream())
     {
          using (RijndaelManaged AES = new RijndaelManaged())
          {
              AES.KeySize = 256;
              AES.BlockSize = 128;

              var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
              AES.Key = key.GetBytes(AES.KeySize / 8);
              AES.IV = key.GetBytes(AES.BlockSize / 8);
              AES.Mode = CipherMode.CBC;

              using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
              {
                   cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                   cs.Close();
              }

              decryptedBytes = ms.ToArray();
          }
     }

     return decryptedBytes;
 }

 public void EncryptFile(string file, string fileEncrypted, string password)
 {
     byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
     byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

     passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

     byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

     File.WriteAllBytes(fileEncrypted, bytesEncrypted);
     listBox1.Items.Add("Enrypted the file");
 }

 public void DecryptFile(string fileEncrypted, string file, string password)
 {
     byte[] bytesToBeDecrypted = File.ReadAllBytes(fileEncrypted);
     byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

     passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

     byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes);

     listBox1.Items.Add("Attempting Decryption");
     File.WriteAllBytes(file, bytesDecrypted);

     var str = System.Text.Encoding.Default.GetString(bytesDecrypted);

     richTextBox1.Text = str;
 }

Если у вас есть идеи / подсказки о том, как мне удастся добиться этой работы, я бы очень признателен!

Всего 2 ответа


Вы использовали неверную кодировку для декодирования вашего расшифрованного байтового массива. Кодировка исходного текстового файла, скорее всего, Unicode / UTF-16. Таким образом, используйте Encoding.Unicode для декодирования дешифрованного массива байтов обратно в текст:

var str = System.Text.Encoding.Unicode.GetString(bytesDecrypted);



Некоторая справочная информация

Итак, что заставило меня думать, что кодировка исходного текстового файла - UTF-16 / Unicode? Эта информация из вопроса дает ключевой намек:

При использовании var str = System.Text.Encoding.Default.GetString (bytesDecrypted) он выводит только ÿþ *

Обратите внимание на ÿþ . Таким образом, появляется UTF-16 LE BOM (*), если текстовые данные, имеющие эту спецификацию, декодируются / отображаются с использованием кодовой страницы ISO / IEC 8859-1 (или CP-1252), которая часто является кодовой страницей по умолчанию, используемой во многих (английский / нелокализованный) установки Windows.

(*) UTF-16 LE BOM (UTF-16 Little-Endian Byte Order Mark) - это два байта 0xFF, 0xFE. Чтобы узнать больше о том, какие спецификации и какова их цель, я предлагаю эту статью в Википедии: https://en.wikipedia.org/wiki/Byte_order_mark


Нашел этот ответ, который, я думаю, применим к вашей проблеме. Обратите особое внимание на «encryptedData = output.ToArray ();»

Чтение из криптостома в конец потока

byte[] encryptedData;
rijCrypto.Padding = System.Security.Cryptography.PaddingMode.ISO10126;
rijCrypto.KeySize = 256;

using (var input = new MemoryStream(Encoding.Unicode.GetBytes(tempData)))
using (var output = new MemoryStream())
{
    var encryptor = rijCrypto.CreateEncryptor();

    using (var cryptStream = new CryptoStream(output, encryptor, CryptoStreamMode.Write))
    {
        var buffer = new byte[1024];
        var read = input.Read(buffer, 0, buffer.Length);
        while (read > 0)
        {
            cryptStream.Write(buffer, 0, read);
            read = input.Read(buffer, 0, buffer.Length);
        }
        cryptStream.FlushFinalBlock();
        encryptedData = output.ToArray();
    }
}

Есть идеи?

10000