我正在编写一个应用程序,它将接收加密的字节数组,其中包含文件名和文件字节,使用以下协议:file_name_and_extension|bytes。然后对字节数组进行解密并传入Encoding.UTF8.getString(decrypted_bytes)会更好,因为我想file_name_and_extension从接收到的字节中进行修剪以将实际文件字节保存到file_name_and_extension.
我简化了我的应用程序,只接收文件,bytes然后Encoding.UTF8.GetString()使用Encoding.UTF8.getBytes(). 之后,我尝试编写一个 zip 文件,但该文件无效。它在使用ASCII或时有效Base64。
private void Decryption(byte[] encryptedMessage, byte[] iv)
{
using (Aes aes = new AesCryptoServiceProvider())
{
aes.Key = receiversKey;
aes.IV = iv;
// Decrypt the message
using (MemoryStream decryptedBytes = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(decryptedBytes, aes.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encryptedMessage, 0, encryptedMessage.Length);
cs.Close();
string decryptedBytesString = Encoding.UTF8.GetString(decryptedBytes.ToArray()); //corrupts the zip
//string decryptedBytesString = Encoding.ASCII.GetString(decryptedBytes.ToArray()); //works
//String decryptedBytesString = Convert.ToBase64String(decryptedBytes.ToArray()); //works
byte[] fileBytes = Encoding.UTF8.GetBytes(decryptedBytesString);
//byte[] fileBytes = Encoding.ASCII.GetBytes(decryptedBytesString);
//byte[] fileBytes = Convert.FromBase64String(decryptedBytesString);
File.WriteAllBytes("RECEIVED\\received.zip", fileBytes);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因为人们不应该尝试将原始字节解释为某种编码中的符号,除非他实际上知道/可以推断出所使用的编码。
如果您收到一些非特定的原始字节,则将它们作为原始字节处理。
因为:
Encoding.UTF8.GetString,该 BOM 在调用后仍保留在那里Encoding.UTF8.GetBytes。无论如何,我重复一遍 - 不要编码/解码任何内容,除非它实际上是字符串数据/所需的格式。