AESencryption – 密钥与IV

我正在处理的应用程序让用户encryption文件。 这些文件可以是任何格式(电子表格,文件,演示文稿等)。

对于指定的input文件,我创build了两个输出文件 – 一个encryption数据文件和一个密钥文件。 您需要这两个文件来获取您的原始数据。 密钥文件只能在相应的数据文件上工作。 它不应该在来自同一用户或任何其他用户的任何其他文件上工作。

AESalgorithm需要两个不同的encryption参数,一个密钥和一个初始化向量(IV)。

我看到了三个创build密钥文件的select:

  1. 在应用程序中embedded硬编码的IV,并将密钥保存在密钥文件中。
  2. 在应用程序中embedded硬编码密钥,并将IV保存在密钥文件中。
  3. 将密钥和IV保存在密钥文件中。

请注意,这是由不同客户使用的相同应用程序。

看起来,三种select都会达到同样的目标。 不过,我想就正确的方法应该得到您的反馈。

正如你从其他答案中看到的,每个encryption文件具有独特的IV是至关重要的,但是为什么呢?

首先,让我们回顾为什么每个encryption文件的独特IV是重要的。 ( 维基百科对IV )。 IV为您的encryption过程添加了随机性。 当使用链接块encryption模式(其中一个encryption数据块合并了先前的encryption数据块)时,我们留下关于第一个块的问题,这是IV进入的地方。

如果你没有IV,并且只用你的密钥使用链式块encryption,那么以相同文本开始的两个文件将产生相同的第一个块。 如果input文件在中途改变,那么两个encryption的文件将开始在这一点开始看起来不同,并开始到encryption文件的末尾。 如果有人在一开始就注意到了相似性,并且知道其中一个文件是从哪个文件开始的,那么他就可以推断出另一个文件是从哪里开始的。 知道明文文件的起始部分和相应的密文是什么可能允许该人确定密钥,然后解密整个文件。

现在添加IV – 如果每个文件使用随机IV,他们的第一个块将是不同的。 上述情况已经受挫。

现在如果每个文件的IV都是一样的呢? 那么,我们又遇到了这个问题。 每个文件的第一个块将encryption到相同的结果。 实际上,这与根本不使用IV没有区别。

所以现在让我们来看看你提出的select:

选项1.在应用程序中embedded硬编码的IV,并将密钥保存在密钥文件中。

选项2.在应用程序中embedded硬编码密钥,并将IV保存在密钥文件中。

这些选项几乎完全相同。 如果以相同文本开始的两个文件产生以相同密文开头的encryption文件,则会被彻底清除。 这两种select都会发生。 (假设有一个主密钥用于encryption所有文件)。

选项3.将密钥和IV保存在密钥文件中。

如果你为每个密钥文件使用一个随机的 IV,那么你很好。 没有两个密钥文件是相同的,每个encryption文件都必须有密钥文件。 不同的密钥文件将不起作用。

PS:一旦你select了3和随机四 – 开始研究如何确定解密是否成功。 从一个文件中获取密钥文件,并尝试使用它来解密不同的encryption文件。 您可能会发现解密过程会在垃圾结果中继续生成。 如果发生这种情况,开始研究authenticationencryption 。

IV的重要之处在于, 你绝对不能使用同一个IV作为两条消息 。 其他一切都是次要的 – 如果你能确保唯一性,随机性就不那么重要了(但是仍然是一件非常好的事情!)。 这个IV并不需要(事实上,在CBC模式下是不可能的 )秘密。

因此,你不应该把IV与钥匙一起保存 – 这意味着你对每条信息都使用相同的IV,这就意味着有了IV。 通常情况下,您可以简单地将IV添加到encryption文件中。

如果你要这样的自己的密码模式,请阅读相关的标准。 NIST在这里有一个关于密码模式的好文件: http : //dx.doi.org/10.6028/NIST.SP.800-38A IV代在附录C中有logging。 密码学是一个微妙的艺术 。 不要试图在正常的密码模式上创build变化; 99%的时间你会创造看起来更安全的东西,但实际上不太安全。

当你使用IV时,最重要的是IV应该尽可能唯一,所以在实践中你应该使用随机IV。 这意味着将其embedded到您的应用程序不是一个选项。 我会将IV保存在数据文件中, 因为只要IV是随机/唯一的 ,它不会损害安全性。