C#试图将文件解密为仅处理内存

C#试图将文件解密为仅处理内存,c#,arrays,encryption,memory,C#,Arrays,Encryption,Memory,我正在尝试仅将文件解密到进程内存。我不希望实际的文件被发送到纯文本,因为它将存储敏感数据。我根本不希望原始文本出现在系统上 我目前正在使用C:\中的一个eula文件进行测试,但无论我使用什么文件,都会遇到相同的问题 我用AES加盐。解密文件的工作原理与我现在将解密的数据转储到文本文档一样,但当我试图将decrypytedbytes编译成字符串时,它只输出3个字符,而这些字符在文档中的任何位置都不存在 这两个字符在使用System.Text.Encoding.UTF8.GetString(byt

我正在尝试仅将文件解密到进程内存。我不希望实际的文件被发送到纯文本,因为它将存储敏感数据。我根本不希望原始文本出现在系统上

我目前正在使用C:\中的一个eula文件进行测试,但无论我使用什么文件,都会遇到相同的问题

我用AES加盐。解密文件的工作原理与我现在将解密的数据转储到文本文档一样,但当我试图将decrypytedbytes编译成字符串时,它只输出3个字符,而这些字符在文档中的任何位置都不存在

这两个字符在使用
System.Text.Encoding.UTF8.GetString(bytesDecrypted,0,bytesDecrypted.Length)
将字节数组编译为字符串时显示

我只尝试了一个基本的
.ToString()
,但它返回了
System.Byte[]
,除此之外什么也没有

使用
var str=System.Text.Encoding.Default.GetString(bytesDecrypted)
时,它只输出ÿþ*

这是我用来加密和解密的代码

 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;
 }

如果你有任何想法/线索,我可以设法使这项工作,我将非常感谢

找到了我认为适用于您的问题的答案。请特别注意“encryptedData=output.ToArray();”


您使用了不正确的编码来解码已解密的字节数组。原始文本文件的编码很可能是Unicode/UTF-16。因此,使用
Encoding.Unicode
编码将解密的字节数组解码回文本:

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


一些背景资料

那么,是什么让我认为原始文本文件的编码是UTF-16/Unicode呢? 问题中的这些信息给出了一个关键提示:

当使用var str=System.Text.Encoding.Default.GetString(bytesDecrypted)时,它只输出ÿþ*

注意
ÿþ
。如果使用ISO/IEC 8859-1(或CP-1252)代码页解码/显示具有此BOM表的文本数据,则UTF-16 LE BOM(*)就是这样显示的,这通常是许多(英语/非本地化)Windows安装中使用的默认代码页


(*)UTF-16 LE BOM(UTF-16小端字节顺序标记)是两个字节0xFF,0xFE。为了进一步了解BOM是什么以及它们的用途,我推荐这篇维基百科文章:

我刚刚复制了您的代码并对其进行了测试,对我来说效果很好,
ÿþ*
看起来像UTF-16 LE BOM(两个字节0xFE 0xFF),这意味着原始文件是UTF-16/UCS 2 Unicode格式的。我真的不知道你用解密的字节数组在代码中做了什么,但是试着用UNICODE编码来解码你的字节块…@elgonzo把它改成UNICODE行得通!非常感谢你@马库萨法,我正在写答案。我现在正在看星际争霸2 WCS统计与特别。我会在比赛中间的休息时间写下我的答案,所以这需要一些时间;-)@elgonzo,哈哈哈-我明白了,很享受;-)结果是我使用了错误的数据类型来加载它。将UTF8更改为Unicode最终确实对我有用。谢谢你的意见
var str = System.Text.Encoding.Unicode.GetString(bytesDecrypted);