2016-03-22 137 views
2

我一直在尋找很多不同的C#加密示例。在大多數例子中,加密密鑰以及初始化向量(IV)作爲字節數組傳遞到加密/解密方法中。將加密密鑰和IV存儲/轉換爲字符串

我想將Key和IV存儲爲字符串。鍵入硬件安全模塊並將IV作爲SQL Server數據庫中的nvarchar。

我不斷遇到關於如何正確地將Key和IV轉換爲字符串的propblems。一些示例說使用Base64編碼,而其他示例使用Encoding.UTF8

這裏是產生IV並將它轉換爲一個Base64串的示例...

using (var aesProvider = new AesCryptoServiceProvider()) 
{ 
    aesProvider.GenerateIV(); 
    var ivBase64 = Convert.ToBase64String(aesProvider.IV); 
    return ivBase64; 
} 

然而,當我通過IV的這個字符串表示到加密方法,然後將其轉換回一個字節數組下面的代碼失敗說IV不是正確的大小。

byte[] initVectorBytes = Encoding.UTF8.GetBytes(initializationVector);` 
// intermediate code excluded for brevity 
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 

在字節數組和字符串表示之間來回轉換加密密鑰和IV是否存在標準方式?

+2

[這是加密的最佳答案(http://stackoverflow.com/a/10366194/542251)我發現。我基本上只是現在使用這個代碼。它接受一個字符串BTW – Liam

+0

@Liam - 感謝這個偉大的例子!你使用哪一個代碼示例?列出了一堆。 – webworm

+0

這取決於!我最近使用SimpleDecryptWithPassword,我並不關心安全性,我主要想混淆一些數據。你使用的方法將取決於你想要數據的安全程度 – Liam

回答

4

您無法將二進制數據轉換爲UTF-8並再次轉回。某些二進制序列不是有效的UTF-8字符,當您轉換爲UTF-8時,數據會丟失。這相當於一些字符被設置爲'?'在編碼之間轉換時。

您可以改爲使用base64編碼的二進制數據到文本,然後base64解碼以獲取原始二進制文件。嘗試將其轉換爲UTF-8,例如:「\ x00?\ xdc \ x80」(即四個字節:0,63,220,128)。它不會編碼爲UTF-8 - 它無效。

的標準方法是使用基本-64編碼 - How do I encode and decode a base64 string?

+1

真棒例子。我認爲我感到困惑,因爲我使用的加密/解密方法使用UTF8編碼..'byte [] plainTextBytes = Encoding.UTF8.GetBytes(plainText);' – webworm