在c#和php中实现的哪些对称加密算法不需要固定长度的输入数据?

在c#和php中实现的哪些对称加密算法不需要固定长度的输入数据?,c#,methods,encryption-symmetric,C#,Methods,Encryption Symmetric,目前我使用AES,但有一个问题,如果用户选择解码未加密的文件,我的程序总是以异常结束,即使在放置try catch并在调试器中运行时也是如此 public static byte[] AES_Decrypt(byte[] data, string[] aes_key) { RijndaelManaged aes = new RijndaelManaged(); aes.KeySize = 256; aes.BlockSize = 256; aes.Mode = C

目前我使用AES,但有一个问题,如果用户选择解码未加密的文件,我的程序总是以异常结束,即使在放置try catch并在调试器中运行时也是如此

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

我不太感兴趣为什么尝试和抓住不起作用,我需要一些解决办法,以避免崩溃。。。更改加密方法也可以。

在我看来,您不应该在该级别隐藏异常。在我看来,当用户试图解密未加密的数据时抛出异常似乎是加密模块的预期行为

相反,您应该在更高级别(加密模块之外)处理此异常。例如,您的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");
}