我需要执行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;
}
答案 0 :(得分:2)
通过调用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();
}