简体   繁体   English

C#中的AES加密功能有什么问题? 为什么返回零长度数据?

[英]What's wrong with my AES encryption function in C#? Why does it return zero length data?

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

Somewhere in code: 代码中的某处:

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

You need using blocks around your streams to ensure they are closed and flushed. 您需要在流周围using块以确保已关闭并刷新它们。 Try this: 尝试这个:

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

If you use using statements with your CryptoStream s , it will flush and close so that it actually updates your MemoryStream s. 如果您在CryptoStream使用using语句 ,它将刷新并关闭,以便实际上更新您的MemoryStream The documentation for CryptoStream documents this behavior: you should always Close when you're done writing to it. CryptoStream文档记录了此行为:完成对它的写入后,应始终Close Here's how that looks (very similar for encrypt and decrypt): 这是它的外观(加密和解密非常相似):

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM