我的 AES 加密函数在 C# 中有什么问题?为什么它返回零长度数据

本文关键字:为什么 返回 数据 问题 什么 函数 加密 AES 我的 | 更新日期: 2023-09-27 18:17:20

public static byte[] AES_Encrypt(byte[] data, string[] aes_key)
{
    var aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 256;
    aes.Padding = PaddingMode.PKCS7;
    aes.Key = Encoding.Default.GetBytes(aes_key[0]);
    aes.IV = Encoding.Default.GetBytes(aes_key[1]);
    var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write);
    cs.Write(data, 0, data.Length);
    return ms.ToArray();
}
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]);
    var decrypt = aes.CreateDecryptor();
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write);
    cs.Write(data, 0, data.Length);
    return ms.ToArray();
}

在代码中的某个地方:

string key = "788b0adbcf8b9211282fe613b18630d2";
string iv = "7fbb16b806fcc24396653b3218552d39";
byte[] test_byte = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] enc_byte = AES_Encrypt(test_byte, new string[] { key, iv }); //getting zero array
byte[] dec_byte = AES_Decrypt(enc_byte, new string[] { key, iv });

我的 AES 加密函数在 C# 中有什么问题?为什么它返回零长度数据

您需要在流周围using块,以确保它们已关闭并刷新。试试这个:

public static byte[] AES_Encrypt(byte[] data, string[] aes_key)
{
    var aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 256;
    aes.Padding = PaddingMode.PKCS7;
    aes.Key = Encoding.Default.GetBytes(aes_key[0]);
    aes.IV = Encoding.Default.GetBytes(aes_key[1]);
    var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
    using(MemoryStream ms = new MemoryStream())
    {
      using(CryptoStream cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
        cs.Write(data, 0, data.Length);
      return ms.ToArray();
    }
}
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]);
    var decrypt = aes.CreateDecryptor();
    using(MemoryStream ms = new MemoryStream())
    {
      using(CryptoStream cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
        cs.Write(data, 0, data.Length);
      return ms.ToArray();
    }
}

如果你在CryptoStream s中使用using语句,它将刷新并关闭,以便它实际上更新你的MemoryStream s。CryptoStream的文档记录了此行为:在完成写入时,应始终Close。这是它的外观(与加密和解密非常相似(:

using (CryptoStream cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
    cs.Write(data, 0, data.Length);
return ms.ToArray();

在将流转换为数组之前调用 FlushFinalBlock。