4

使用aes_cfb_encryptandaes_cfb_decrypt函数,我有以下问题。

  1. 加密中的unsigned char *iv (初始化向量)是什么。
  2. 是否需要保留*iv进行解密。
  3. 每次我加密一个数据块时,*iv都会被修改,我对这个修改后的*iv有什么影响。
  4. 我正在加密一个大约 100mb 的大文件,并第一次传递一个随机*iv,我是否必须在循环的其余部分使用相同的*iv,或者我必须使用上次调用中更新的*iv的加密块。

  5. 最后,我正在处理一个结构化文件,所以我必须使用Sizeof(struct)作为缓冲区的长度还是必须使用sizeof(struct)*8作为缓冲区的长度来进行加密或解密。请指导..

AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);

AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);

4

2 回答 2

9

在回答您的问题时,请注意以下几点:

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 是如何工作的,很遗憾,我无法帮助你。

于 2013-02-09T07:46:06.633 回答
1

加密系统中的初始化向量 (IV) 是一个随机值,作为加密系统初始化的一部分包含在内,以确保如果相同的数据被多次加密,它总是看起来不同。这是安全加密系统的要求,以确保查看多个不同加密消息的攻击者无法轻易确定其中任何两个消息是否相同。理想情况下,IV 应完全随机选择。

您不需要保留 IV 进行解密。通常,IV 与加密数据一起以明文形式发送。这不是安全问题 - 这是设计使然。

IV 在每次加密迭代中都会更改,因为在内部,密码系统正在迭代地将分组密码应用于数据,然后使用该密码的输出,结合一些额外的数据,作为下一次分组密码应用的新 IV . 然后根据需要重复此过程多次。我怀疑(但不确定)IV 已交还给您,以便您可以在之前中断的地方加密更多数据。 你绝对应该仔细检查一下!

至于是使用你的结构的大小还是八倍 - 我不能在没有看到更多代码的情况下说。但是,您可能应该提供要加密的总字节数,因此如果您要加密结构的八个副本,请传入结构的八倍sizeof

希望这可以帮助!

于 2013-02-09T04:43:25.903 回答