我在网上找到了这篇文章,并实现了它的修改版本。
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);
}
这就是我调用加密方法的方式
因此,经过一番讨论,问题实际上是此处未显示的代码的一部分。事实上,上面的原始代码总是给出相同的结果,单元测试应该已经通过(另外在断言上使用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
属性本身可以解决此问题。