【问题标题】:AES decryption does not return original valueAES解密不返回原始值
【发布时间】:2021-05-11 16:50:24
【问题描述】:

我编写了一个 SecurityExtensions 静态类来处理使用 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 是一个简单的类,用于保存加密值和 IV

公共类 AesEncryptionInfo { public AesEncryptionInfo(byte[] encrypted, byte[] inversionVector) { 反转向量 = 反转向量; 加密=加密;

    }

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

保罗

【问题讨论】:

    标签: c# encryption aes


    【解决方案1】:

    您正在使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2012-03-12
      相关资源
      最近更新 更多