【问题标题】:How to convert AES byte[] into string and vice versa?如何将 AES 字节 [] 转换为字符串,反之亦然?
【发布时间】:2018-11-28 08:57:33
【问题描述】:

我的方法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;
}

【问题讨论】:

  • 什么样的字符串? Base64?十六进制?如果您想知道为什么文本编码方法不起作用,我建议您阅读this。简而言之:它们不是为此而生的。

标签: c# arrays string encoding byte


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的回答。我的平等检查完全是错误的。 encrypted.SequenceEqual(test) 返回 true。
  • 完美解释,正是我正在寻找的答案。谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    考虑byte[] encryptedbyte[] test,当您测试与== 是否相等时,默认情况下会比较引用而不是其内容。这解释了为什么您测试 encrypted == test 失败。

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

    【讨论】:

    • 我的意思是我想知道是否有一种方法可以让我将字节数组转换为字符串并将字符串转换回字节数组而不会丢失任何数据。这就是我比较两个数组的原因。
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多