AESManaged 为相同的密钥/iv 组合返回不同的加密值

本文关键字:返回 组合 加密 密钥 AESManaged iv | 更新日期: 2023-09-27 18:32:07

我在网上找到了这篇文章,并实现了它的修改版本。

public static byte[] Encrypt(byte[] input, byte[] iv)
    {
        var aes = new AesManaged();
        aes.Key = StringToByteArray("abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890");
        aes.IV = StringToByteArray("00010001000000000000000000000000");
        aes.KeySize = 128; 
        var encryptor = aes.CreateEncryptor();
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                cs.Write(input, 0, input.Length);
                cs.Close();
            }
            return ms.ToArray();
        }
    }
        public static byte[] StringToByteArray(string hex)
    {
        var NumberChars = hex.Length;
        var bytes = new byte[NumberChars / 2];
        for (var i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }

现在我的问题是,在这里我提供了相同的 IV 和密钥(显然只是为了测试,在生产中我每次加密时都会更改 IV),但每次加密相同的输入时,它都会返回不同的加密字节。

我查找了一些帖子,他们说特定键/iv 组合的输出应该是相同的。我在这里错过了什么吗?


编辑:

[TestMethod]
    public void Encryption_returns_same_value_for_same_key_and_iv()
    {
        const string input = "my input";
        var bytes = Encoding.UTF32.GetBytes(input);
        var result = EncryptionManager.Encrypt(bytes, bytes);
        var result2 = EncryptionManager.Encrypt(bytes, bytes);
        Assert.AreEqual(result, result2);
    }

这就是我调用加密方法的方式

AESManaged 为相同的密钥/iv 组合返回不同的加密值

因此,经过一番讨论,问题实际上是此处未显示的代码的一部分。事实上,上面的原始代码总是给出相同的结果,单元测试应该已经通过(另外在断言上使用SequenceEqual)。但是,在设置密钥后,代码中的aes.KeySize(由一些同事)更改,如下所示:

aes.Key = StringToByteArray("abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890");
aes.IV = StringToByteArray("00010001000000000000000000000000");
aes.KeySize = 128; 

但是,正如我们在设置 KeySize 属性后输出使用的键所发现的那样

Console.WriteLine("Used Key for Encryption: " + BitConverter.ToString(aes.Key));

修改KeySize后,密钥将更改为随机密钥。这就是为什么我们不断得到不同的结果。使用相同输入向量调用函数的示例输出:

用于加密的密钥:C7-35-58-42-3A-2A-79-DE-0D-09-78-20-34-90-1F-EC
密文:E4-AA-A3-3B-01-CF-F0-C1-07-9A-0B-73-3E-70-C9-8A

用于加密的密钥:8A-95-E7-26-60-F9-CE-66-BA-A4-DE-D2-FA-70-AC-DE
密文: C5-E7-D3-32-38-21-54-25-86-61-70-CB-94-46-A6-37

用于加密的密钥:A4-D7-01-8F-35-2B-7F-2D-E6-0A-A9-7F-95-42-71-D6
密文:F1-B2-75-64-D1-90-75-32-0D-CB-D9-AE-11-AE-DB-DD

通过首先设置KeySize然后设置Key属性本身可以解决此问题。