1

暗号化されたバイト配列を復号化しようとしています (K1 で暗号化し、K2 で復号化します)。暗号化ストリームを閉じようとすると、Visual Studio が例外「BAD DATA」をスローする

これがDES復号化のコードスニペットです

public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
    {
        MemoryStream ms = new MemoryStream();
        DES mDES = DES.Create();
        mDES.Key = key;
        mDES.IV = iv;
        mDES.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherData, 0, cipherData.Length);
        cs.Close();
        Byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }

初期ベクトルは暗号化と同じです。なぜこのエラーが発生したのかわかりません。

追加: Greg B の推奨に従って、暗号化のコード スニペットをここに投稿します。暗号化の出力は復号化の入力です (2 つの異なる鍵)

        public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
    {
        MemoryStream ms = new MemoryStream();
        DES mDES = DES.Create();
        mDES.Key = key;
        mDES.IV = iv;
        mDES.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherData, 0, cipherData.Length);
        cs.Close();
        Byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }
4

1 に答える 1

3

発生した問題は、選択したパディング モードに起因します。

暗号化テキストを復号化するときにパディングが使用されるため、暗号化ストリームは、復号化されたバイトを取得するときにパディングを削除しようとします。データが暗号化されたキーを使用しないため、「ガベージ」が発生します...クリプトストリームは削除する必要があるパディングを検出できず、観察された例外で操作が失敗します。

DES クラスで 3DES のようなものを作り直したい場合は、復号化と次の暗号化ステップに PaddingMode NONE を使用します (したがって、最初の暗号化または最後の復号化でのみパディングが使用されます)。

于 2011-05-28T11:15:27.420 に答える