我正在处理的应用程序允许用户加密文件。文件可以是任何格式(电子表格,文档,演示文稿等)。
对于指定的输入文件,我创建了两个输出文件 - 加密数据文件和密钥文件。您需要这两个文件才能获取原始数据。密钥文件必须仅适用于相应的数据文件。它不适用于来自同一用户或任何其他用户的任何其他文件。
AES算法需要两个不同的加密参数,一个密钥和一个初始化向量(IV)。
我看到了创建密钥文件的三种选择:
请注意,它与不同客户使用的应用程序相同。
看起来所有三个选择都会实现相同的最终目标。但是,我想就正确的方法应该得到您的反馈。
答案 0 :(得分:74)
从其他答案中可以看出,为每个加密文件设置一个唯一的IV是至关重要的,但为什么会这样?
首先 - 让我们来看看为什么每个加密文件的唯一IV很重要。 (Wikipedia on IV)。 IV为您的加密过程开始增加了随机性。当使用链式块加密模式(其中一个加密数据块包含先前的加密数据块)时,我们留下了第一个块的问题,这是IV进入的地方。
如果您没有IV,并且仅使用密钥使用链式块加密,则以相同文本开头的两个文件将生成相同的第一个块。如果输入文件在中途发生了变化,那么从该点开始到加密文件的末尾,两个加密文件将开始变得不同。如果有人在开始时注意到了这种相似性,并且知道其中一个文件是从哪个开始的,那么他就可以推断出其他文件的起源。知道明文文件的开头是什么以及相应的密文是什么,可以让该人确定密钥,然后解密整个文件。
现在添加IV - 如果每个文件使用随机IV,它们的第一个块将是不同的。上述情况遭到挫败。
现在如果每个文件的IV相同怎么办?好吧,我们再次遇到问题。每个文件的第一个块将加密到相同的结果。实际上,这与完全不使用IV没有什么不同。
现在让我们来看看你提出的选择:
选项1.在应用程序中嵌入硬编码IV并将密钥保存在密钥文件中。
选项2.在应用程序中嵌入硬编码密钥,并将IV保存在密钥文件中。
这些选项非常相似。如果两个以相同文本开头的文件生成以相同密文开头的加密文件,那么您就会被软管化。这将在这两个选项中发生。 (假设有一个主密钥用于加密所有文件)。
选项3.将密钥和IV保存在密钥文件中。
如果您为每个密钥文件使用随机 IV,那么您就是好的。没有两个密钥文件是相同的,每个加密文件必须有它的密钥文件。不同的密钥文件将无法使用。
PS:一旦你使用选项3和随机IV - 开始研究如何确定解密是否成功。从一个文件中获取密钥文件,并尝试使用它来解密其他加密文件。您可能会发现解密进行并产生垃圾结果。如果发生这种情况,请开始研究authenticated encryption。
答案 1 :(得分:27)
关于IV的重要事项是你绝不能对两条消息使用相同的IV 。其他一切都是次要的 - 如果你能确保独特性,随机性就不那么重要了(但仍然是一件非常好的事情!)。 IV不需要(实际上,在CBC模式下不能)是秘密的。
因此,你不应该将密钥与密钥一起保存 - 这意味着你对每条消息都使用相同的IV,这就违背了IV的要求。通常,您只需将IV添加到加密文件中,前提是明确的。
如果您打算使用此类自己的密码模式,请阅读相关标准。 NIST在这里有一个关于密码模式的好文档:http://dx.doi.org/10.6028/NIST.SP.800-38A IV生成记录在附录C中。密码学是一种微妙的艺术。不要试图在正常的密码模式上创建变体; 99%的时间你会创建看起来更安全的东西,但实际安全性更低。
答案 2 :(得分:12)
当你使用IV时,最重要的是IV应该尽可能独特,所以在实践中你应该使用随机IV。这意味着将其嵌入您的应用程序不是一种选择。我会将IV保存在 data 文件中,因为只要IV是随机/唯一,它就不会损害安全性。
答案 3 :(得分:0)