【问题标题】:Encrypting Files with AES C# in Chunks在块中使用 AES C# 加密文件
【发布时间】:2018-01-25 22:05:21
【问题描述】:

我正在尝试使用 AES 加密在 C# 中分块加密和解密文件。

目前,它以 1000 字节的块读取文件,对每个块进行加密,并以 {IV}{Chunk0}{Chunk1}{Chunk2}... 的格式写入文件(没有任何分隔符,也没有大括号)。

解密文件时,它会从文件中读取前 16 个字节,将其用作 AES IV,然后分块解密文件的其余部分。

我的问题是,我如何知道要解密的每个加密块的大小?加密时,每个块由 1000 字节的纯文本组成,但在加密时,这个 1000 的长度会发生变化。

我应该在每个块之间使用分隔符,例如逗号吗?或者我是否可以避免在块之间使用分隔字符,而是通过读取 x 字符块来解码? (如上所述,如果每个加密块都是 1000 字节的加密明文,我是否可以计算每个加密块的大小?)

【问题讨论】:

  • AES 是一种块密码,可处理 128 位 = 16 字节的块。 1000 不能被 16 整除 - 因此这是一个糟糕的选择。
  • 澄清一下,我说的是要加密的 1000 字节明文。输出总是可以被 16 整除。每个块都使用PKCS7 填充。我知道使用 1000 可能是个坏主意;相反,我将使用 1024。但我的问题仍然存在。
  • 这听起来类似于磁盘加密。您应该阅读专家如何进行磁盘加密,尤其是他们用于维护安全性的分组密码模式。
  • 目前尚不清楚您要完成什么,因此以下内容可能不适合。更多信息会有所帮助。 1. 使用一个块大小是块大小的倍数。 2. 不要重新初始化加密,继续使用相同的实例。 3. padding 仅在 final 被调用时添加到 final 块中。

标签: c# encryption aes chunking


【解决方案1】:

最简单?当您加密每个块时,获取字节长度,然后将其存储在您的文件中:

{IV}{LengthOfEncryptedChunk}{EncryptedChunk}{IV}{LengthOfEncryptedChunk} ... etc

【讨论】:

  • 这似乎是一个解决方案。仅供参考:我为每个文件使用了一个IV,并且每个块都使用相同的IV 加密。我可以这样做吗?
  • 诚实吗?你可能会没事,具体取决于内容。 IV 旨在阻止诸如已知内容攻击和篡改攻击之类的事情。只要每个文件都有不同的 IV,我唯一担心的是这 1000 个字节是否与文件中的其他 1000 个字节相似。
  • @Acidic:不,可能不对每个块使用相同的 IV。它有多糟糕取决于密码模式。对于计数器模式,这可能是一场灾难。
  • 请注意,下一个块的 IV 是加密的前一个块。每个块都不需要新的 IV。如果每个块是块大小的倍数,也不需要填充。那么就不需要穿插的IV,也不需要这样的格式。
  • 我很确定他只是在真空中加密每 1024 个字节 - 这不是链中的后续加密(因为,老实说,甚至存储字节长度有什么意义?)用于链接的密码模式,因为他从不加密超过一个块。对于每一个块,这只是一个块加密。这就是为什么我认为 IV 不需要为文件中的每个块而变化,因为除非有某种方法可以预测任何给定的 1024 字节块的内容,否则实际上没有任何方法可以进行已知内容攻击。 IV 只需要因文件而异。
猜你喜欢
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多