加密数据的大小错误(AES)

时间:2013-03-08 10:19:47

标签: c# encryption aes cryptostream

我需要执行byte []的加密数组。我使用了Microsoft提供的示例。不幸的是,加密数据被截断为16的倍数。如果在数据示例中我将添加8倍字节0,则数据将被正确加密。 填充已经设置,但我没有看到任何改变它。 如何解决这个问题,数据不会被切断。

public byte[] EncryptAES(byte[] plainBytes)
{
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    byte[] FKey = encoding.GetBytes("A002AD9AD73C402190C3E733D82CEA00");
    byte[] FIV = encoding.GetBytes("zyxwvutsrqponmlk");

    // Check arguments.
    if (plainBytes == null || plainBytes.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (FKey == null || FKey.Length <= 0)
        throw new ArgumentNullException("Key");
    if (FIV == null || FIV.Length <= 0)
        throw new ArgumentNullException("Key");
    byte[] encrypted;
    // Create an RijndaelManaged object
    // with the specified key and IV.
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = FKey;
        rijAlg.IV = FIV;
        rijAlg.Padding = PaddingMode.Zeros;
        rijAlg.Mode = CipherMode.CBC;

        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                // plainBytes.Length = 2216 
                csEncrypt.Write(plainBytes, 0, plainBytes.Length);

                // encrypted.Length = 2208
                encrypted = msEncrypt.ToArray();
            }
        }
    }

    // Return the encrypted bytes from the memory stream.
    return encrypted;
}

3 个答案:

答案 0 :(得分:2)

CryptoStream

  

通过调用Close方法完成后,应始终显式关闭CryptoStream对象。这样做会刷新流,会导致CryptoStream对象处理所有剩余的数据块。但是,如果在调用Close方法之前发生异常,则可能不会关闭CryptoStream对象。要确保始终调用Close方法,请在try / catch语句的finally块中调用Close方法。

我的重点

因此,在尝试对结果执行任何操作之前,请先致电Close


基本上,padding用于处理加密块序列的最后一个块。由于CryptoStream不知道您打算调用Write()的次数,因此在您致电Close之前,它不会应用填充或写入任何最终未完成的阻止。

(或者,正如Monkieboy指出的那样,FlushFinalBlock也可以用来表明你已经完成了)

答案 1 :(得分:2)

只需调用FlushFinalBlock()即可解决16个问题的倍数。

答案 2 :(得分:0)

试试这个

    using (MemoryStream msEncrypt = new MemoryStream())
    {
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
        {
            csEncrypt.Write(plainBytes, 0, plainBytes.Length);
        }
        encrypted = msEncrypt.ToArray();
    }