2013-12-17 257 views
0

我真的不知道如何解釋這個,所以我會添加我的代碼並嘗試從那裏通過它。正如你所看到的,這很難遵循通用的編程標準。我試圖從密鑰和iv代中刪除所有「隨機性」,所以我提供了自己的字符串並將其適當添加到AES值中。AES加密和解密

一旦我將該值加密,我將它轉換爲一個字符串並將其作爲密碼參數存儲在數據庫中。我的問題是能夠將其解密回原來的密碼值,這對於某些Web請求稍後需要。我試圖將字符串值轉換回字節數組,但我得到一個「無效的塊大小」錯誤,然後是「錯誤的PKCS7填充。無效的長度250」。不知道這意味着什麼。

任何想法?

static public void Main() 
{ 
    string original ="{password for testing purposes}"; 
    string originalkey = "{128 key}"; 
    string originaliv = "{16 iv}"; 


    byte[] enckey = Encoding.UTF8.GetBytes(originalkey); 
    byte[] enciv = Encoding.UTF8.GetBytes(originaliv); 

    using (AesManaged myAes = new AesManaged()) 
    { 
     myAes.Key = enckey;    
     myAes.IV = enciv; 
     byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV); 
     string result = Encoding.UTF8.GetString(encrypted); 

     string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV); 


     Console.WriteLine("Encrypted: {0}", result); 
     Console.WriteLine("Round Trip: {0}", roundtrip); 


     byte[] decrypted = Encoding.UTF8.GetBytes(result); 

     roundtrip = DecryptStringFromBytes_Aes(decrypted, myAes.Key, myAes.IV); 


     Console.WriteLine("Encrypted: {0}", roundtrip); 
     Console.WriteLine("Round Trip: {0}", result); 

    } 
     } 
+0

只要你的編碼byte []數組BLOB成一個字符串可能會給你幾個問題 - 它可能包含零字節,可能會導致字符未由數據庫正確處理(取決於數據庫配置)。嘗試堅持使用文本編碼不會干擾字符串的編碼(例如具有字節十六進制值的字符串或Base64編碼) – elgonzo

回答

3

您正在處理二進制,非文本數據並將其轉換爲字符串,然後嘗試將其重新轉換爲二進制數據。如果要存儲加密數據的字符串表示形式,我建議使用二進制到文本編碼算法,如Base64編碼(請參閱An efficient way to Base64 encode a byte array?)。

如果您可以將其存儲爲二進制文件(例如,在SQL Server varbinary列中),那麼您可以完全跳過字符串編碼。

byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV); 
roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV); 

Console.WriteLine("Original: {0}", original); 
Console.WriteLine("Decrypted: {0}", roundtrip); 
3

問題是你正在使用的編碼。它假定字節數組是一個UTF8字符串,我不確定它是。從this question使用喬恩斯基特答案,我會去與你的字節數組轉換爲字符串並回如下:

string result = Convert.ToBase64String(encrypted); 
... 
byte[] decrypted = Convert.FromBase64String(result);