繁体   English   中英

用于将字节数组转换为字符串的编码,反之亦然

[英]Encoding to use to convert Bytes array to String and vice-versa

我使用此代码来加密字符串(基本上,这是MSDNRijndael 类中给出的示例):

public static String AESEncrypt(String str2Encrypt, Byte[] encryptionKey, Byte[] IV)
{
    Byte[] encryptedText;

    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        // Use the provided key and IV
        rijAlg.Key = encryptionKey;
        rijAlg.IV = IV;

        // Create a decrytor to perform the stream transform
        ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for encryption
        using (MemoryStream msEncrypt = new MemoryStream())
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
        {
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {
                // Write all data to the stream
                swEncrypt.Write(str2Encrypt);
            }

            encryptedText = msEncrypt.ToArray();
        }
    }

    return Encoding.Default.GetString(encryptedText);
}

我使用Encoding.Default将字节数组转换为字符串,但我不确定这是一个好的解决方案。 我的目标是将加密文本(例如密码...)存储在文件中。 我应该继续使用Encoding.Default还是使用Encoding.UTF8Encoding或其他东西?

如果文件被移动到不同的操作系统上,当我尝试加密和解密它们时,这会对存储的值产生负面影响吗?

绝对不应该使用Encoding将任意二进制数据转换为文本。 Encoding用于当您获得真正编码文本的二进制数据时 - 这不是。

相反,使用Convert.ToBase64String将二进制数据编码为文本,然后使用Convert.FromBase64String进行解码。

如果您的目标是在文件中存储加密信息,并且您有一个字节数组,则应该直接存储它 -根本不要将其转换为字符串。 例如,在 C# 中,您可以使用File.WriteAllBytes将字节数组直接写入文件。 请记住,文件保存字节,而不是字符串(如果您将字符串写入文件,则将使用某种Encoding将其转换为字节,即使您使用的技术未明确引用Encoding )。

如果您确实需要将字节数组存储为字符串(例如,因为它将存储在 JSON 中),那么最常用的技术是将 base64 与Convert.ToBase64String一起使用,正如 Jon 所提到的。

(在非加密应用程序中,您可能有一个包含 ASCII 和二进制数据混合的byte[] ,并且您希望将其转换为字符串。在这种情况下,base64 工作正常,但它隐藏了文本 - 字符串格式的字节数组是与 base64 类似,但保留 ASCII 运行 - Loyc.Essentials NuGet 包中的C# 版本此处为Java 版本)

是的, Encoding.Default是您机器的当前 ANSI 代码页,并且在多台机器/区域设置之间可能会有所不同。 如果数据是文本数据并使其可移植,则需要使用固定编码格式,例如 UTF8。

但是,由于您的数据不是文本数据,因此您不能尝试使用任何文本编码来转换为字符串。 最好的选择是使用十六进制或 Base64 编码或将其保留为 blob/字节数组。

我在这里不是 100% 确定,但我认为 Encoding.Default 指的是系统默认编码,是的,可以从系统更改为系统..

如果我在你那里我会使用 UTF8 或其他一些不会因系统而改变的编码..

有关扩展的 ascii 的更多信息,请看这里

http://en.wikipedia.org/wiki/Extended_ASCII

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM