2010-02-16 137 views
3

每次我運行這個和加密,輸出是可變的,當我試圖解密 我得到「填充是無效的,不能被刪除。」一直跟這一兩天吵架,而我現在處於虧損狀態。「填充無效且無法移除」 - 此代碼有什麼問題?

private static string strIV = "abcdefghijklmnmo"; //The initialization vector. 
    private static string strKey = "abcdefghijklmnmoabcdefghijklmnmo"; //The key used to encrypt the text. 

    public static string Decrypt(string TextToDecrypt) 
    { 
     return Decryptor(TextToDecrypt); 
    } 

    private static string Encryptor(string TextToEncrypt) 
    { 
     //Turn the plaintext into a byte array. 
     byte[] PlainTextBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToEncrypt);    

     //Setup the AES providor for our purposes. 
     AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider(); 
     aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey); 
     aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV); 
     aesProvider.BlockSize = 128; 
     aesProvider.KeySize = 256;    
     aesProvider.Padding = PaddingMode.PKCS7; 
     aesProvider.Mode = CipherMode.CBC; 

     ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);    
     byte[] EncryptedBytes = cryptoTransform.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length); 
     return Convert.ToBase64String(EncryptedBytes);       
    } 

    private static string Decryptor(string TextToDecrypt) 
    { 
     byte[] EncryptedBytes = Convert.FromBase64String(TextToDecrypt); 

     //Setup the AES provider for decrypting.    
     AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider(); 
     aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey); 
     aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV); 
     aesProvider.BlockSize = 128; 
     aesProvider.KeySize = 256;    
     aesProvider.Padding = PaddingMode.PKCS7; 
     aesProvider.Mode = CipherMode.CBC; 

     ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV); 
     byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length); 
     return System.Text.Encoding.ASCII.GetString(DecryptedBytes); 
    } 
} 

回答

11

您需要設置BlockSizeKeySize您設置KeyIV之前。此外,您應該爲每封郵件生成一個隨機IV,並注意ICryptoTransform實現了IDisposable,因此應該處置這些對象。

+0

這是解決我的問題的迴應。每個人都很有幫助。我花了一段時間才意識到設置這些屬性是依賴於順序的。謝謝戴夫! – user274063 2010-02-16 06:19:21

+0

本示例中使用的AesCryptoServiceProvider也實現了IDisposable,因爲它是.NET中可用的非託管AES實現。建議使用說明。 – 2012-02-02 18:38:58

+0

你剛剛救了我的一天。謝謝! – nrodic 2013-04-12 00:02:26

相關問題