我在这里阅读了一些关于正确使用初始化向量的线程,并且正在重构一些现有代码以使用每个项目的随机 IV。
我有一个方法,它需要一个数据块和一个密钥,并且应该使用提供的密钥和一个随机 IV 来加密 blob。
public static byte[] AesEncrypt(byte[] data, byte[] key)
{
byte[] output = new byte[0];
Console.WriteLine("Data: {0}", Encoding.ASCII.GetString(data));
Console.WriteLine("Key: {0}", BitConverter.ToString(key));
using (AesCryptoServiceProvider acp = new AesCryptoServiceProvider())
{
acp.GenerateIV();
byte[] vector = acp.IV;
using (ICryptoTransform trans = acp.CreateEncryptor(key, vector))
{
Console.WriteLine("Vector: {0}", BitConverter.ToString(vector));
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Write))
using(BinaryWriter bw = new BinaryWriter(cs))
{
bw.Write(vector);
bw.Write(data);
cs.FlushFinalBlock();
output = ms.ToArray();
}
}
}
}
Console.WriteLine("Output: {0}", BitConverter.ToString(output));
return output;
}
目的是防止为相同的数据输入和密钥生成相同的密码。不幸的是,尽管控制台输出显示每次生成不同的 IV,但多次调用使用相同数据和密钥的方法会产生相同的密码。
Data: 4761739001010010
Key: 7C-26-D9-6B-A1-FC-9E-67-9A-A2-7D-5F-52-5C-09-54-FE-DD-A5-C6-90-DD-0F-B3-CC-E2-7E-0E-4F-2D-2E-97
Vector: ED-02-6E-C6-B3-7A-74-66-4B-E5-47-23-16-D6-87-3B
Output: CB-F7-93-16-64-24-E2-F0-81-00-99-DA-97-F1-46-43-7D-F7-C4-AC-2E-C8-D4-D9-F1-7C-67-6E-F3-14-F0-4F-C7-1B-02-AE-41-4C-6B-B9-80-3A-64-4B-14-10-60-1B
Data: 4761739001010010
Key: 7C-26-D9-6B-A1-FC-9E-67-9A-A2-7D-5F-52-5C-09-54-FE-DD-A5-C6-90-DD-0F-B3-CC-E2-7E-0E-4F-2D-2E-97
Vector: 3E-3B-32-FB-82-03-03-9F-54-96-67-AA-29-5E-09-C4
Output: CB-F7-93-16-64-24-E2-F0-81-00-99-DA-97-F1-46-43-7D-F7-C4-AC-2E-C8-D4-D9-F1-7C-67-6E-F3-14-F0-4F-C7-1B-02-AE-41-4C-6B-B9-80-3A-64-4B-14-10-60-1B
知道这是哪里出错了吗?