176 votes

Le rembourrage est invalide et ne peut pas être enlevé?

J'ai regardé en ligne pour que cette exception signifie que par rapport à mon programme mais n'arrive pas à trouver une solution, ou la raison pour laquelle il n'arrive à mon programme spécifique. J'ai été en utilisant l'exemple de mon msdn pour le chiffrement et le déchiffrement d'un xmldocument à l'aide de l'algorithme de rijndael. Le cryptage fonctionne bien, mais lorsque je tente de déchiffrer, j'obtiens l'exception suivante: rembourrage est pas valide et ne peut pas être supprimé?

Quelqu'un peut me dire ce que je peux faire pour résoudre ce problème s'il vous plaît. Je suis à cours de ressources. Je n'arrive pas à trouver la réponse nulle part. Mon code ci-dessous où j'ai reçu la clé, etc, et si le cryptoMode est faux il va appeler le déchiffrer méthode, qui est l'endroit où l'exception se produit:

public void Cryptography(XmlDocument doc, bool cryptographyMode)
{
    RijndaelManaged key = null;
    try
    {
    // Create a new Rijndael key.
    key = new RijndaelManaged();
    const string passwordBytes = "Password1234"; //password here 

    byte[] saltBytes = Encoding.UTF8.GetBytes("SaltBytes");
    Rfc2898DeriveBytes p = new Rfc2898DeriveBytes(passwordBytes, saltBytes);
    // sizes are devided by 8 because [ 1 byte = 8 bits ] 
    key.IV = p.GetBytes(key.BlockSize/8);
    key.Key = p.GetBytes(key.KeySize/8);

    if (cryptographyMode)
    {
        Ecrypt(doc, "Content", key);
    }
    else
    {
        Decrypt(doc, key);
    }

    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    finally
    {
    // Clear the key.
    if (key != null)
    {
        key.Clear();
    }
    }

}

private void Decrypt(XmlDocument doc, SymmetricAlgorithm alg)
{
    // Check the arguments.  
    if (doc == null)
    throw new ArgumentNullException("Doc");
    if (alg == null)
    throw new ArgumentNullException("alg");

    // Find the EncryptedData element in the XmlDocument.
    XmlElement encryptedElement = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;

    // If the EncryptedData element was not found, throw an exception.
    if (encryptedElement == null)
    {
    throw new XmlException("The EncryptedData element was not found.");
    }


    // Create an EncryptedData object and populate it.
    EncryptedData edElement = new EncryptedData();
    edElement.LoadXml(encryptedElement);

    // Create a new EncryptedXml object.
    EncryptedXml exml = new EncryptedXml();


    // Decrypt the element using the symmetric key.
    byte[] rgbOutput = exml.DecryptData(edElement, alg); <----  I GET THE EXCEPTION HERE
    // Replace the encryptedData element with the plaintext XML element.
    exml.ReplaceData(encryptedElement, rgbOutput);

}

98voto

rossum Points 7191

Rijndael/AES est un bloc de cypher. Il crypte les données en 128 bits (16 caractères) blocs. Remplissage cryptographique est utilisée pour s'assurer que le dernier bloc du message est toujours la bonne taille.

Votre méthode de déchiffrement s'attend à ce que son défaut de rembourrage est, et n'est pas à la trouver. Comme @NetSquirrel dit, vous devez définir explicitement le rembourrage pour le chiffrement et le déchiffrement. Sauf si vous avez une bonne raison de faire autrement, utilisez le remplissage PKCS#7.

83voto

atconway Points 4164

Assurez-vous que les touches à utiliser pour chiffrer et déchiffrer sont les mêmes. Le rembourrage de la méthode, même si pas explicitement devrait encore permettre le déchiffrement/chiffrement (si ce n'est qu'ils seront les mêmes). Toutefois, si vous utilisez un autre jeu de clés de décryptage de celui utilisé pour le chiffrement, vous aurez ce message d'erreur:

Le rembourrage n'est pas valide et ne peut pas être supprimé

Si vous utilisez un algorithme pour générer dynamiquement des touches qui ne fonctionnent pas. Ils doivent être la même pour le chiffrement et le déchiffrement. Une façon courante est de demander à l'appelant de fournir les clés dans le constructeur des méthodes de cryptage de classe, pour empêcher le processus de cryptage/décryptage d'avoir une main dans la création de ces éléments. Il se concentre sur la tâche à portée de main (cryptage et décryptage de données) et nécessite l' iv et key à être fourni par l'appelant.

32voto

HockeyJ Points 1408

Pour le bénéfice des personnes cherchant, il peut être intéressant de vérifier l'entrée en cours de décryptage. Dans mon cas, les informations envoyées pour le déchiffrement entraient (à tort) dans une chaîne vide. Cela a entraîné une erreur de remplissage.

Cela peut être lié à la réponse de rossum, mais je pense que cela mérite d'être mentionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X