2014-08-28 110 views
-2

當我嘗試使用AES加密,我得到的錯誤Invalid length for a Base-64 char array or string當我嘗試執行這行代碼:Rijndael加密/解密拋出異常

byte[] clearBytes = Convert.FromBase64String(clearText); 

這裏是我的代碼:

public string AESEncrypt(string clearText) 
{ 
    clearText = HttpUtility.UrlEncode(clearText) ; 
    byte[] clearBytes = Convert.FromBase64String(clearText) ; 
    byte[] ivBytes = Encoding.UTF8.GetBytes(InitV); 
    byte[] keyBytes = Encoding.UTF8.GetBytes(EncryptionKey) ; 

    var symmetricKey = new RijndaelManaged(); 
    symmetricKey.Mode = CipherMode.CBC; 
    symmetricKey.Padding = PaddingMode.PKCS7; 

    var enctryptor = symmetricKey.CreateEncryptor(keyBytes, ivBytes); 

    using (MemoryStream ms = new MemoryStream()) 
    { 
    using (CryptoStream cs = new CryptoStream(ms, enctryptor, CryptoStreamMode.Write)) 
    { 
     cs.Write(clearBytes, 0, clearBytes.Length); 
     cs.Close(); 
    } 
    clearText = Convert.ToBase64String(ms.ToArray()); 
    } 

    return clearText; 
} 

或者,當我嘗試解密,我得到的錯誤The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.試圖執行這行代碼:

byte[] cipherBytes = Convert.FromBase64String(cipherText); 

這裏是我的代碼:

public string AESDecrypt(string cipherText) 
{ 
    string clearText; 

    cipherText = HttpUtility.UrlEncode(cipherText) ; 

    byte[] cipherBytes = Convert.FromBase64String(cipherText); 
    byte[] ivBytes = Encoding.UTF8.GetBytes(InitV); 
    byte[] keyBytes = Encoding.UTF8.GetBytes(EncryptionKey); 

    var symmetricKey = new RijndaelManaged(); 
    symmetricKey.Mode = CipherMode.CBC; 
    symmetricKey.Padding = PaddingMode.PKCS7; 

    var enctryptor = symmetricKey.CreateDecryptor(keyBytes, ivBytes); 

    using (MemoryStream ms = new MemoryStream()) 
    { 
    using (CryptoStream cs = new CryptoStream(ms, enctryptor, CryptoStreamMode.Write)) 
    { 
     cs.Write(cipherBytes, 0, cipherBytes.Length); 
     cs.Close(); 
    } 
    clearText = Convert.ToBase64String(ms.ToArray()); 
    } 

    return clearText; 
} 
+1

一定表示你的問題的編程語言。否則,它們將不容易被看到,並且自動語法突出顯示也不會被應用。 – 2014-08-28 22:12:32

+0

不要大幅編輯您的問題。如果您認爲您的原始問題不再有效,請刪除它或其他內容,但絕不會對其進行實質性更改(尤其是在回答問題後)。 – 2014-08-28 22:18:05

+0

Moi,請不要爲標題添加標籤,使用適當的標籤標記問題就足夠了。 – 2014-08-28 22:36:39

回答

1

我不知道是什麼讓你認爲URL編碼生成基地64個編碼的字節,但對其進行解碼通常會導致你得到的錯誤。

cipherText = HttpUtility.UrlEncode(cipherText); 
    byte[] cipherBytes = Convert.FromBase64String(cipherText); 

只是絕對的廢話。請查看這些功能的功能,然後重試。

+0

謝謝你的建議 – 2014-08-28 22:05:07

+0

對不起,在答案上有點生硬。 URLEncode替換非URL友好字符,其中base 64是字節數組的字符編碼。如上所述,彼此完全不同。 – 2014-08-28 22:11:32

+0

我知道它是什麼,我不想開始一些幼稚的戰鬥...我只補充說,因爲我看到一個博客,建議它,我得到它的工作買去除,獲得明文的UTF表示,但解密不是顯示加密的內容。 – 2014-08-28 22:13:19

0

您是否將您的base64編碼字符串傳遞給QueryString?如果是這樣,它可能包含「+」符號,這些符號不是QueryString上的有效數據。 URL編碼您的base 64字符串。

http://msdn.microsoft.com/en-us/library/zttxte6w(v=vs.110).aspx

+0

現在要清楚了,這個方法需要一個靜態的「123456789」作爲測試..... – 2014-08-28 22:51:23