2011-11-03 88 views
14

我使用此代碼來加密字符串(基本上,這是對Rijndael class on MSDN給出的示例):編碼用來字節轉換數組字符串,反之亦然

public static String AESEncrypt(String str2Encrypt, Byte[] encryptionKey, Byte[] IV) 
{ 
    Byte[] encryptedText; 

    using (RijndaelManaged rijAlg = new RijndaelManaged()) 
    { 
     // Use the provided key and IV 
     rijAlg.Key = encryptionKey; 
     rijAlg.IV = IV; 

     // Create a decrytor to perform the stream transform 
     ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV); 

     // Create the streams used for encryption 
     using (MemoryStream msEncrypt = new MemoryStream()) 
     using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
     { 
      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
      { 
       // Write all data to the stream 
       swEncrypt.Write(str2Encrypt); 
      } 

      encryptedText = msEncrypt.ToArray(); 
     } 
    } 

    return Encoding.Default.GetString(encryptedText); 
} 

我使用Encoding.Default轉換一個字節數組轉換爲字符串,但我不確定這是一個好的解決方案。我的目標是將加密的文本(如密碼......)存儲在文件中。我應該繼續使用Encoding.Default還是使用Encoding.UTF8Encoding或其他?

當我嘗試加密和解密它們時,如果文件被移動到不同的操作系統上,會對存儲值產生負面影響嗎?

回答

43

您應該絕對不是使用Encoding將任意二進制數據轉換爲文本。 Encoding適用於當您獲得真正爲編碼文本的二進制數據時 - 這不是。

取而代之,使用Convert.ToBase64String將二進制數據編碼爲文本,然後使用Convert.FromBase64String進行解碼。

+0

感謝喬恩。將我從嚴重的錯誤中拯救出來。 – Otiel

+9

另請參閱[菲爾哈克的帖子在此擴展](http://feeds.haacked.com/~r/haacked/~3/5hyXGYRO0Bo/hazards-of-converting-binary-data-to-a-string.aspx) –

+0

另請參閱http://stackoverflow.com/questions/646974/is-there-a-standard-technique-for-packing-binary-data-into-a-utf-16-string –

0

是的,Encoding.Default是您機器的當前ANSI代碼頁,並且在多臺機器/區域設置之間可能不同。如果數據是文本數據並使其可移植,則需要使用固定的編碼格式,例如UTF8。

但是,由於您的數據不是文本數據,您不能嘗試使用任何文本編碼轉換爲字符串。最好的選擇是使用十六進制或Base64編碼或將其保存爲blob/byte數組。

+0

這顯然不是*文本數據 - 它是執行加密的結果,所以它是任意的二進制數據。任何'Encoding'在這裏都不合適。 –

+0

是的,一旦我知道數據根本不是文本,就澄清了一下。 – Deanna

-1

我不是100%肯定,在這裏,但我認爲Encoding.Default指的是系統默認的編碼是的,可以根據系統的改變..

如果我在那裏你我會用UTF-8或其他一些編碼不改變因系統..

有關擴展ASCII更多信息看這裏

http://en.wikipedia.org/wiki/Extended_ASCII

+1

不,使用UTF-8是*不是一個好的解決方案 - 這個二進制數據是*不是* UTF-8編碼的文本;它是任意的二進制數據。 –

相關問題