Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将AES字节[]转换为字符串,反之亦然?_C#_Arrays_String_Encoding_Byte - Fatal编程技术网

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

C# 如何将AES字节[]转换为字符串,反之亦然?,c#,arrays,string,encoding,byte,C#,Arrays,String,Encoding,Byte,我的方法是返回一个字节数组。 如果我加密一条消息,并使用返回的字节数组作为aesdefcrypt(byte[]text)的输入,则一切正常。问题是,我需要将其转换为字符串,反之亦然,因此我尝试了以下方法: byte[] encrypted = enc.AESEncrypt("Testmessage"); string encryptedStr = Convert.ToBase64String(encrypted); byte[] test = Convert.FromBase64String(e

我的方法是返回一个字节数组。 如果我加密一条消息,并使用返回的字节数组作为
aesdefcrypt(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;
}

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


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

字节数组中保存的加密有效负载不能直接转换为字符串,或者至少在没有使用ANSI编码和双方(编码和解码)在字符串的代码页上达成一致的情况下。如果你使用任何Unicode编码(UTF-8,UTF-16,…),你肯定会有包含无效代码点的字节,所以谁不能被解码成一个字符

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


您只需要加密。SequenceEquals(test)
,如中所述。

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

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

什么样的绳子?Base64?十六进制?如果您想知道为什么文本编码方法不起作用,我建议您阅读。简而言之:它们不是为它而构建的。我想知道是否有一种方法允许我将字节数组转换为字符串,并将字符串转换回字节数组而不丢失任何数据。这就是我比较这两个数组的原因。非常感谢您的回答。我的平等检查完全错了。加密。SequenceEqual(测试)返回true。