簡體   English   中英

如何將AES byte []轉換為字符串,反之亦然?

[英]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[] encryptedbyte[] 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM