2010-02-16 39 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

相关问题