[英]How to convert AES byte[] into string and vice versa?
我的方法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 byte []轉換為字符串,反之亦然?
這是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;
}
保存在字節數組中的加密有效載荷不能直接轉換為字符串,或者至少不能不使用ANSI編碼並且雙方(編碼和解碼)都在字符串的代碼頁上達成一致。 而且,如果您使用任何Unicode編碼(UTF-8,UTF-16等),則肯定會包含包含無效代碼點的字節,因此無法將誰解碼為字符。
那就是base64發揮作用的地方。 這是一種將字節數組表示為ASCII字符串的安全方法,ASCII字符串是幾乎每個(如果不是每個)編碼都實現的子集。 因此,使用該base64代碼就可以了。
您只需要encrypted.SequenceEquals(test)
,如.NET中比較兩個字節數組中所述 。
考慮使用byte[] encrypted
和byte[] test
,當默認情況下用==
測試相等性時,將不比較引用的內容。 這說明了為什么您測試encrypted == test
失敗。
您還詢問如何將byte[]
轉換為字符串,這與您的encrypted == test
測試根本無關。 通常,您需要使用各種System.Text.Encoding.*.GetString(byteArray);
執行轉換,但是您需要知道byteArray
使用哪種編碼。 此信息必須單獨傳遞,您可能有一個規范,其中規定所有字節數組都以UTF-8編碼,或者您可以將編碼與數據一起傳遞,但沒有通用答案。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.