在回答您的问题时,请注意以下几点:
PT(x) = Plain Text representation of 'x'
CT(x) = Cipher Text representation of 'x'
Bn = Logical Data Block 'n' in a sequence of multiple blocks.
1. 什么是静脉注射?
IV 是Initialization Vector的缩写。它用于以所谓的链式或反馈模式执行加密的对称块加密算法。在任何一种情况下,前一个加密数据块都被用作一块功能数据“goo”来更改下一个要加密的数据块。每个连续的加密数据块都被提供给先前已经加密的数据块作为它们要使用的粘性块。但是第一块明文呢?它的特殊酱汁是用什么做的?答:IV提供给函数。从图形上看,它如下所示:
CT(B1) = Encrypt(IV + PT(B1))
CT(B2) = Encrypt(CT(B1) + PT(B2))
CT(B3) = Encrypt(CT(B2) + PT(B3))
...
CT(Bn) = Encrypt(CT(Bn-1) + PT(Bn))
注意:上面的“+”表示将先前的密码块应用于下一个明文块。不应将其视为数学加法。将其视为“结合”。
IV 的大小必须与所使用的对称算法的块大小相同。AES-128-CFB 和 AES-256-CFB 都使用 128 位块大小(16 字节)。因此,出于您在这个问题中的目的,您的 IV 应该是 16 字节的随机 goo,并且应该使用符合 FIPS 的安全随机源算法在加密端生成。
2. 是否需要保留IV进行解密?
是的,但不一定是你可能首先想到的时尚。必须以某种方式保留第一个 IV(由您提供) 。传统上,它会发送到您认为应该在的地方。作为第一块加密数据。这常常把人们吓坏了,他们想“但如果我用数据发送 IV,它就没有那么安全了,是吗?” 这样想吧。无论如何,您要发送多少个“IV”?请记住,每个数据块都使用前一个加密数据块作为其 IV 进行加密。因此,您实际上是在发送整个 IV 流,每个加密块是下一个加密块的 IV,等等。初始 IV 在输出密文中的位置是一个数据表示问题,但它最终的去向与这个问题。必须保存。作为其输出流的一部分,您的 API 可能会为您执行此操作(事实上,这并不罕见)。
3. 每次我加密一个数据块时 *iv 都会被修改,我对这个修改后的 *iv 有什么影响?
我不熟悉您使用的 API,但听起来您已经获得了用于下一次加密的 IV ,当您考虑反馈或链接如何用于块模式加密时,这非常有意义。您不应该重复使用相同的 IV。使用最后返回的作为下一个。由于您的 API 正在就地修改 IV,因此您可能需要做的唯一一件事就是在发送之前将初始IV 保留在其他地方。我会将第一个密文块与您的 IV 进行比较。如果它们不相同,您可能需要发送您的 IV,然后是数据流中的密文链,并让接收者知道第一个块是解密的 IV。
4. 我正在加密一个大约 100mb 的大文件,并且第一次传递一个随机的 *iv,我是否必须在循环的其余部分使用相同的 *iv,或者我必须使用更新后的 *iv加密块的最后一次调用。
见(3)。对每个连续块使用更新的 IV。
5. 最后,我正在处理一个结构化文件,所以 i Sizeof(struct) 作为缓冲区的长度还是必须使用 sizeof(struct)*8 作为缓冲区的长度进行加密或解密。?
以字节(而不是位)为单位使用结构的大小。C/C++sizeof(yourstruct)
应该为您计算这一点,但请注意,如果您将每个结构加密为一个独立的实体(而不是一个整体的整个文件),则每次加密都将携带最少数量的数据添加到帐户( a) 用于该结构的 IV,以及 (b) 将最后一个块填充到偶数块边界,假设您使用的是 PKCS5 填充。因此,加密结构的确切大小将是:
IV + ((sizeof(struct) + 15)/16)*16) bytes.
同样,如果您将每个结构作为单一加密独立加密和存储,那么您的 API 可能会为您解释其中的一部分。
有关对称 AES 的更多信息,请参阅Wiki 上的 AES 条目。有关 CFB 分组密码模式的信息,请参阅同一站点上的分组密码操作模式一文。
我希望这有帮助。做一些功课,最重要的是,准确了解你的 API 是如何工作的,很遗憾,我无法帮助你。