0

現在、私は AES を使用していますが、ユーザーが暗号化されていないファイルをデコードすることを選択した場合、catch を配置してデバッガーを使い果たした場合でも、prog は常に例外で終了します。

public static byte[] AES_Decrypt(byte[] data, string[] aes_key)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 256;
    aes.Mode = CipherMode.CBC;
    aes.Padding = PaddingMode.PKCS7;

    aes.Key = Encoding.Default.GetBytes(aes_key[0]);
    aes.IV = Encoding.Default.GetBytes(aes_key[1]);

    if (data.Length % (aes.BlockSize / 8) != 0)
        return null;

    var decrypt = aes.CreateDecryptor();

    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
            try { cs.Write(data, 0, data.Length); } //crash here "data lenght for decryption is invalid" and "Padding is invalid and cannot be removed".
            catch (Exception exc) { return null; }

        return ms.ToArray();
    }
}

try と catch が機能しない理由にはあまり興味がありません。クラッシュを回避するための回避策が必要です...暗号化方法の変更は問題ありません。

4

1 に答える 1

1

私の観点からは、そのレベルで例外を非表示にすべきではありません。ユーザーが暗号化されていないデータを復号化しようとしたときに例外をスローすることは、暗号化モジュールの予想される動作のように思えます。

代わりに、この例外をより高いレベル (暗号化モジュールの外) で処理する必要があります。たとえば、UI レイヤーに次のようなものを含めることができます。

try
{
    var encryptedFilePath = ShowOpenFileDialog();
    var decryptedFilePath = TryDecryptFile(encryptedFilePath);
    ShowMessagePopup("Your file has been decrypted to: " + decryptedFilePath);
}
catch (CryptographicException)
{
    ShowErrorPopup("Unable to decrypt file!\n" +
     "Please make sure the file you selected is valid");
}
于 2013-06-07T13:06:18.370 に答える