c# - Aes 加密 MemoryStream.ToArray 为空

标签 c# encryption aes

我对 AesEncrypt 有疑问,我有这段加密文本的代码块:

private byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("Key");
    byte[] encrypted;
    // Create an Aes object 
    // with the specified key and IV. 
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Padding = PaddingMode.None;
        aesAlg.Key = Key;
        aesAlg.IV = IV;

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

        // Create the streams used for encryption. 
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(plainText);
                    csEncrypt.FlushFinalBlock();
                }
            }
            encrypted = msEncrypt.ToArray();
        }
    }

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

问题是,在某些情况下,msEncrypt.ToArray() 返回一个空的byte[],而在某些情况下,它工作得很好...

请拯救我的日子!

最佳答案

您需要在调用 FlushFinalBlock() 之前刷新 swEncrypt,以确保您尝试加密的所有数据都传递到 CryptoStream >.

改变

swEncrypt.Write(plainText);
csEncrypt.FlushFinalBlock();

swEncrypt.Write(plainText);
swEncrypt.Flush();
csEncrypt.FlushFinalBlock();

进行此更改后,如果输入不是 block 大小的倍数(在 AES 中为 16 字节),CryptoStream 现在将引发异常。

您有两种选择来解决此问题。

  1. 手动将输入填充到 block 大小的倍数。对于 “这是一个测试字符串”,您可以将其填充为类似 “这是一个测试字符串\0\0\0\0\0\0\0\0\0\0\0"。填充字符可以是任何你想要的,只要确保解密后删除填充即可。
  2. 将填充模式更改为其他模式,例如 PKCS7Zeros。除非您绝对需要使用 PaddingMode.None(例如为了与其他系统兼容),否则这是更好的解决方案。

关于c# - Aes 加密 MemoryStream.ToArray 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783182/

相关文章:

c# - UnitTests - Moq - 如何从与 Setup() 中的参数匹配的 Moq 中返回 () 对象

c# - 通过代码生成trx文件

java - 如何使用 x509 证书加密和解密消息?

c - AES_set_encrypt_key 段错误

mysql - 在 mysql : Unknown system variable 'block_encryption_mode' 中更改 aes 的 aes 模式时出错

c# - UISearchController 和 MvvmCross

c# - 流利的 nHibernate 加入

android - 如何在Android中写一个类似于Python函数的hash函数?

c# - TripleDES : Encrypt (.Net) - 解密 (CryptoJS)

Golang AES-CBC 256 使用 CryptoJS 解密