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

时间:2016-01-27 20:06:21

标签: c# encryption aes

我在网上找到this article并实施了它的修改版本。

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

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

1 个答案:

答案 0 :(得分:1)

因此经过一些讨论后,问题实际上是代码的一部分,这里没有显示。实际上,上面的原始代码总是给出相同的结果,并且单元测试应该已经通过(在断言上另外使用# This is just for illustration purpose I have no # knowledge how the original plot was created import numpy as np import pylab as plt fig, ax = plt.subplots(2, 3, sharex=True) x = np.arange(0, 5, 0.1) n = 0 for i in xrange(2): for j in xrange(3): y = x ** n ax[i, j].plot(x, y) n += 1 # My real work starts here axes = fig.get_axes() print axes plt.show() )。但是,在设置密钥后,代码(由某些同事)更改了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)); 后,会更改为随机密钥。这就是为什么我们不断得到不同的结果。用于使用相同的输入向量调用函数的示例输出

  

用于加密的密钥: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然后设置KeySize属性本身即可解决问题。