AES解密没有return原值

AES decryption does not return original value

我已经编写了一个 SecurityExtensions static class 来处理使用 AES CBC 128 位的加密

    public static class SecurityExtensions
    {
        private static Aes GetAes(string keyText, byte[] iv)
        {
            var key = keyText.ToByteArray();
            using var result = Aes.Create();
            result.Mode = CipherMode.CBC;
            result.Padding = PaddingMode.Zeros;
            result.KeySize = 128;
            if (iv.Length > 0)
            {
                result.IV = iv;
            }

            result.Key = key;

            return result;
        }

        public static AesEncryptionInfo EncryptWithAes(this string plainText, string keyText)
        {
            var aesAlg = GetAes(keyText, new byte[0]);
            var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            byte[] encrypted;
            using (var msEncrypt = new MemoryStream())
            {
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (var swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }

            var result = new AesEncryptionInfo(encrypted, aesAlg.IV);
            return result;
        }

        public static string DecryptFromAes(this byte[] cipherText, string keyText, byte[] iv)
        {
            var aesAlg = GetAes(keyText, iv);
            var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for decryption.
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        var result = srDecrypt.ReadToEnd();
                        return result;
                    }
                }
            }
        }
    }

除非我有 result.Padding = PaddingMode.Zeros 行(它不在我用作基础的 MS 示例中),否则会崩溃

当我如下使用扩展时,没有返回原始值

const string key = "test1234test1234";
var textToEncrypt = "TESTING ENCRYPTION";
var actualEncryptionInfo = textToEncrypt.EncryptWithAes(key);
var decryptedText = actualEncryptionInfo.Encrypted.DecryptFromAes(key, actualEncryptionInfo.InversionVector);

我做错了什么?

AesEncryptionInfo 是一个简单的 class,它包含加密值和 IV

public class AesEncryptionInfo { public AesEncryptionInfo(byte[] 加密, byte[] inversionVector) { 反转向量 = 反转向量; 加密 = 加密;

    }

    public byte[] InversionVector { get; set; }
    public byte[] Encrypted { get; set; }
}

保罗

您正在 GetAes 方法中使用 using 语句处理 Aes 实例。

变化:

using var result = Aes.Create();

至:

var result = Aes.Create();

并在DecryptFromAesEncryptWithAes中处理Aes。

using var aesAlg = GetAes(keyText, new byte[0]);
using var aesAlg = GetAes(keyText, iv);