2010-02-16 11 views
3

Chaque fois que je l'exécute et crypte, la sortie est variable, et quand je tente de décrypter je reçois "Padding est invalide et ne peut pas être retiré." Je me suis battu avec cela pour un jour ou deux maintenant et je suis à perte."Padding est invalide et ne peut pas être enlevé" -Quel problème avec ce code?

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); 
    } 
} 

Répondre

11

Vous devez définir le BlockSize et la KeySize avant de définir le Key et le IV. De plus, vous devriez probablement générer un IV aléatoire pour chaque message et noter que ICryptoTransform implémente IDisposable donc ces objets doivent être éliminés.

+0

C'est la réponse qui a résolu mon problème. Tout le monde était vraiment utile. Il m'aurait fallu un certain temps pour réaliser que la configuration de ces propriétés dépendait de l'ordre. Merci Dave! – user274063

+0

Le fournisseur AesCryptoServiceProvider utilisé dans cet exemple implémente également IDisposable car il s'agit de l'implémentation AES non gérée disponible dans .NET. Une instruction using est recommandée. –

+0

Vous venez de sauver ma journée. Merci! – nrodic