如何将AES byte []转换为字符串,反之亦然?

时间:2018-11-28 08:57:33

标签: c# arrays string encoding byte

我的方法AESEncrypt(string text)返回一个字节数组。 如果我加密了一条消息,并使用返回的字节数组作为AESDecrypt(byte[] text)的输入,则一切正常。问题是,我需要将其转换为字符串,反之亦然,因此我尝试了以下操作:

byte[] encrypted = enc.AESEncrypt("Testmessage");
string encryptedStr = Convert.ToBase64String(encrypted);
byte[] test = Convert.FromBase64String(encryptedStr);

Console.WriteLine((encrypted == test));

我也尝试过Encoding.ASCII.GetString()Encoding.UTF8.GetString()

但是encrypted == test每次都会返回false ...

我需要使用什么方法将AES字节[]转换为字符串,反之亦然?

这是AESEncrypt方法:

public byte[] AESEncrypt(string s)
{
    byte[] encrypted;

    using (AesManaged aes = new AesManaged()) {
        ICryptoTransform encryptor = aes.CreateEncryptor(AESKey, AESIV);
        using (MemoryStream ms = new MemoryStream()) {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) {
                using (StreamWriter sw = new StreamWriter(cs)) {
                    sw.Write(s);
                }
                encrypted = ms.ToArray();
            }
        }
    }

    return encrypted;
}

3 个答案:

答案 0 :(得分:2)

保存在字节数组中的加密有效载荷不能直接转换为字符串,或者至少不能不使用ANSI编码且字符串的代码页上的双方(编码和解码)都不能转换为字符串。而且,如果您使用任何Unicode编码(UTF-8,UTF-16等),则肯定会包含包含无效代码点的字节,因此无法将谁解码为字符。

这就是base64发挥作用的地方。这是一种将字节数组表示为ASCII字符串的安全方法,ASCII字符串是几乎每个(如果不是每个)编码都实现的子集。因此,使用该base64代码就可以了。

您只需要encrypted.SequenceEquals(test),如Comparing two byte arrays in .NET中所述。

答案 1 :(得分:0)

请考虑byte[] encryptedbyte[] test,默认情况下,当您测试与==的相等性时,将不比较引用的内容。这说明了为什么您测试encrypted == test失败的原因。

您还询问如何将byte[]转换为与您的encrypted == test测试完全无关的字符串。通常,您会使用各种System.Text.Encoding.*.GetString(byteArray);进行转换,但是您需要知道byteArray使用了哪种编码。此信息必须单独传递,您可能有一个规范,其中规定所有字节数组都以UTF-8编码,或者您可以将编码与数据一起传递,但没有通用答案。

答案 2 :(得分:0)

base64直接用于此目的。 这是一个例子:

编码

public static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

解码

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}