1. ホーム
  2. c#

[解決済み】パディングが無効で、削除できない?

2022-01-28 03:35:01

質問

この例外が私のプログラムに関連して何を意味するのか、オンラインで調べましたが、解決策や私の特定のプログラムで起こっている理由を見つけることができないようです。私はRijndaelアルゴリズムを使ってXmlDocumentを暗号化・復号化するために、私のmsdnが提供するサンプルを使っています。暗号化はうまくいくのですが、復号化しようとすると、次のような例外が発生します。

パディングが無効であり、取り除くことができない

この問題を解決するためにどうしたらいいか、どなたか教えていただけませんか? 以下の私のコードは、キーとその他のデータを取得するところです。cryptoModeがfalseの場合、decryptメソッドを呼び出すので、そこで例外が発生します。

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

}

解決方法は?

Rijndael/AESはブロック暗号の一種です。 128ビット(16文字)ブロック単位でデータを暗号化します。 暗号化パディング は、メッセージの最後のブロックが常に正しいサイズであることを確認するために使用されます。

復号化メソッドは、デフォルトのパディングを期待しているのですが、それが見つかりません。 NetSquirrel が言うように、暗号化と復号化の両方で明示的にパディングを設定する必要があります。 特に理由がない限り、PKCS#7 のパディングを使用してください。