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

本文关键字:数据 输入 不需要 对称 php 实现 加密算法 | 更新日期: 2023-09-27 18:17:17

目前我使用AES并有一个问题,如果用户选择解码未加密的文件,我的进程总是以异常结束,即使当尝试捕获放置并运行调试器时。

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

我不是那么感兴趣为什么尝试和捕捉不工作,我需要一些解决方法来避免崩溃…并且更改加密方法也可以。

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

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

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