AESManaged returns 相同 key/iv 组合的不同加密值
AESManaged returns different encrypted value for same key/iv combination
我在网上找到 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),但每次加密时它都会返回不同的加密字节相同的输入。
我查了一些帖子,他们说特定 key/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
后,密钥变为随机密钥。这就是为什么我们不断得到不同的结果。使用相同的输入向量 :
调用函数 的示例输出
Used Key for Encryption: C7-35-58-42-3A-2A-79-DE-0D-09-78-20-34-90-1F-EC
Ciphertext: E4-AA-A3-3B-01-CF-F0-C1-07-9A-0B-73-3E-70-C9-8A
Used Key for Encryption: 8A-95-E7-26-60-F9-CE-66-BA-A4-DE-D2-FA-70-AC-DE
Ciphertext: C5-E7-D3-32-38-21-54-25-86-61-70-CB-94-46-A6-37
Used Key for Encryption: A4-D7-01-8F-35-2B-7F-2D-E6-0A-A9-7F-95-42-71-D6
Ciphertext: F1-B2-75-64-D1-90-75-32-0D-CB-D9-AE-11-AE-DB-DD
问题是先设置KeySize
再设置Key
属性自己解决的。
我在网上找到 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),但每次加密时它都会返回不同的加密字节相同的输入。
我查了一些帖子,他们说特定 key/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
后,密钥变为随机密钥。这就是为什么我们不断得到不同的结果。使用相同的输入向量 :
Used Key for Encryption: C7-35-58-42-3A-2A-79-DE-0D-09-78-20-34-90-1F-EC
Ciphertext: E4-AA-A3-3B-01-CF-F0-C1-07-9A-0B-73-3E-70-C9-8AUsed Key for Encryption: 8A-95-E7-26-60-F9-CE-66-BA-A4-DE-D2-FA-70-AC-DE
Ciphertext: C5-E7-D3-32-38-21-54-25-86-61-70-CB-94-46-A6-37Used Key for Encryption: A4-D7-01-8F-35-2B-7F-2D-E6-0A-A9-7F-95-42-71-D6
Ciphertext: F1-B2-75-64-D1-90-75-32-0D-CB-D9-AE-11-AE-DB-DD
问题是先设置KeySize
再设置Key
属性自己解决的。