AES加密-密钥与IV


74

我正在使用的应用程序允许用户加密文件。文件可以是任何格式(电子表格,文档,演示文稿等)。

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

AES算法需要两个不同的参数进行加密,分别是密钥和初始化向量(IV)。

我看到创建密钥文件的三个选择:

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

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

看来这三个选择都可以达到相同的最终目标。但是,我想就正确的方法获得您的反馈。

Answers:


83

从其他答案中可以看出,每个加密文件具有唯一的IV至关重要,但这为什么呢?

首先-让我们回顾一下为什么每个加密文件唯一的IV很重要。(IV上的维基百科)。IV为您的加密过程的开始增加了随机性。当使用链接块加密模式(其中一个加密数据块合并了先前的加密数据块)时,我们会遇到关于第一个块的问题,这是IV的所在。

如果您没有IV,并且仅使用密钥使用链接块加密,则两个以相同文本开头的文件将产生相同的第一个块。如果输入文件在中途更改,则两个加密文件从此时开始直到加密文件的末尾将看起来不同。如果有人在一开始就注意到了相似之处,并且知道其中一个文件是从哪个开始的,那么他可以推断出另一个文件是从哪个开始的。了解明文文件的开头和对应的密文是什么,可以使该人确定密钥,然后解密整个文件。

现在添加IV-如果每个文件使用随机IV,则它们的第一个块将不同。上面的情况已被阻止。

现在,如果每个文件的IV相同怎么办?好吧,我们又遇到了问题。每个文件的第一块将加密为相同的结果。实际上,这与完全不使用IV没什么不同。

现在,让我们进入您建议的选项:

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

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

这些选项几乎相同。如果两个以相同文本开头的文件生成了以相同密文开头的加密文件,那么您将被束缚。这两种情况都会发生。(假设有一个主密钥用于加密所有文件)。

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

如果对每个密钥文件使用随机IV,那很好。没有两个密钥文件是相同的,并且每个加密文件都必须具有它的密钥文件。其他密钥文件将不起作用。

PS:一旦您选择了选项3和随机IV,请开始研究如何确定解密是否成功。从一个文件中获取一个密钥文件,然后尝试使用它来解密另一个加密文件。您可能会发现解密继续进行并产生垃圾结果。如果发生这种情况,请开始研究经过身份验证的加密


1
解密需要IV。
尾巴2012年

5
但是,(至少在CBC模式下)错误的IV只会破坏第一个块,您仍然可以解密其余文件内容。
MV。

1
我在这里的几个地方看到了与上述类似的注释(“错误的IV只会破坏第一个块,您仍然可以解密其余文件内容”)。这不是真的。由于加密的第一个块是第二个块的IV(依此类推),因此未知的IV表示无法解密任何块。维基百科上的CBC图清楚地表明了这一点:链接
Rich

4
@Rich-我知道我的评论晚了4年,但是...我尝试使用损坏的IV并使用.NET AES库进行解密。仅第一个块已损坏。这是因为,加密的块是CBC中下一个块的IV ...并且在解密除第一个块之外的其他内容时,您始终拥有加密的前一个块。
Les

2
@Les-也许晚了4年,但您绝对正确。我的上述评论对CBC完全是错误的。不知道我在想什么。谢谢。
丰富

32

关于IV的重要一点是,您绝不能对两个消息使用相同的IV。其他所有事情都是次要的-如果您可以确保唯一性,那么随机性就不那么重要了(但仍然是一件非常好的事情!)。IV不必是秘密的(实际上,在CBC模式下不能)。

因此,您不应将IV与密钥一起保存-这意味着您对每条消息都使用相同的IV,这使获得IV毫无意义。通常,您只需将IV直接添加到加密文件中即可。

如果要像这样滚动自己的密码模式,请阅读相关标准。NIST在此处提供了有关密码模式的出色文档:http : //dx.doi.org/10.6028/NIST.SP.800-38A附录C中记录了IV代。密码术是一种微妙的艺术。不要试图在普通密码模式上产生变化;99%的时间,您将创建看起来更安全但实际上不安全的东西。


6
@Peter,这不是静脉注射的作用。特别是,如果IV未知,但密钥已知,则在CBC模式下,黑客将无法恢复纯文本的第一块。但是,它们将能够恢复其余的纯文本。IV的唯一目的是干扰文件,以便重复加密不会产生相同的输出(因此,攻击者无法通过看到密文相同来区分两个文件具有相同的内容)。
bdonlan

1
编辑:我删除了以前的评论。我同意,阅读我cwe.mitre.org/data/definitions/329.html表示您应该使用随机IV而不是重用它。将其基于密码,盐等将违反此规定。
Phil Bolduc,2012年

2
如果仅使用静态IV来加密随机数据(会话密钥或其他派生密钥),则可以使用它。否则,您应该使用随机IV,并且如果每个加密消息都有足够的空间用于附加<blocksize>字节,则最好始终使用一个。
Maarten Bodewes,2012年

1
@owlstead,如果您使用固定的IV,则确保消息的第一个纯文本块始终唯一是至关重要的。整个消息是唯一的还不够。另外,如果您的消息是单个纯文本块(例如,派生密钥)的大小且唯一,则可以简单地使用ECB模式。
bdonlan

1
@bdonlan:当然,第一个块必须是唯一的,但是随机数据就是这种情况。如果消息是单个纯文本块的大小,则可以使用ECB模式,但
前提

13

使用IV时,最重要的是IV应该尽可能唯一,因此在实践中您应该使用随机IV。这意味着无法将其嵌入到您的应用程序中。我将IV保存在数据文件中,因为只要IV是random / unique,它就不会损害安全性。


最终,该想法是确保黑客无法破坏打开的加密文件。IV的大小似乎小于键的大小。如您所建议,如果密钥是固定的且IV有所变化,则黑客尝试破解文件的组合数量将更少。我有什么想念的吗?
彼得

12
IV并不是要“确保黑客无法破坏打开的加密文件”。这是为了确保,如果对同一文件进行两次加密,它将产生不同的加密输出。
bdonlan

bdolan那个小消息终于使我掉了钱。.我一直在努力理解IV与消息长度相比如何重要,但我认为它不是真的,但与消息内容相比却很重要。 !
DusteD 2014年

0

IV用于通过随机性提高安全性,但这并不意味着所有算法都使用IV,即 在此处输入图片说明

诀窍是IV应该持续多长时间?通常,它与块大小或密码大小相同。例如,AES将具有16个字节用于IV。此外,还可以选择IV类型,即eseqiv,seqiv,chainiv ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.