我的方法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;
}
答案 0 :(得分:2)
保存在字节数组中的加密有效载荷不能直接转换为字符串,或者至少不能不使用ANSI编码且字符串的代码页上的双方(编码和解码)都不能转换为字符串。而且,如果您使用任何Unicode编码(UTF-8,UTF-16等),则肯定会包含包含无效代码点的字节,因此无法将谁解码为字符。
这就是base64发挥作用的地方。这是一种将字节数组表示为ASCII字符串的安全方法,ASCII字符串是几乎每个(如果不是每个)编码都实现的子集。因此,使用该base64代码就可以了。
您只需要encrypted.SequenceEquals(test)
,如Comparing two byte arrays in .NET中所述。
答案 1 :(得分:0)
请考虑byte[] encrypted
和byte[] 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);
}