【问题标题】:Implementation of CBC mode of operation of AESAES的CBC操作模式的实现
【发布时间】:2018-11-05 15:24:49
【问题描述】:

我为 128、192 和 256 位密钥实现了 AES 密码。我正在尝试实现块密码操作模式,目前正在实现密码块链接模式。

关于CBC模式的实现,我有两个问题:

1.这是关于向密码例程提供数据,我在cbc()\\this function implements cbc mode 中调用密码例程。我的问题是我应该在cbc() 中读取文件(包含用于加密的数据),还是可以在cbc() 之外读取文件并将数据块作为协议传递给cbc()。哪一个是安全的实现。

2。 CBC 模式需要一个随机生成的初始化向量 aka IV(为此我在 c++11 中使用随机字节生成器),因为用户只在加密/解密时输入密钥我怎么知道使用的初始化向量是什么当文件被加密时。另外,如果我需要将 IV 提供给用户,该怎么做?

我在 C++11 中实现这些。

谢谢。

【问题讨论】:

  • 请澄清您的第一个问题。至于第二个问题,请参阅我们姊妹网站 Cryptography Stack Exchange 上的 this question 和标记为 initialization-vector 的其他问题。另请注意,you should probably use an authenticated encryption mode 而不是 CBC。
  • @IlmariKaronen 请再次查看帖子我已经编辑并澄清了第一个问题。
  • @IlmariKaronen 你提到的第二个问题的链接,它回答了我的问题,但我怀疑我可以在加密文件中包含 IV 并在解密时提取它吗?
  • “我怀疑是否可以将 IV 包含在加密文件中并在解密时提取它。”你有什么疑问?这是通过 IV 的标准方法。
  • @RobNapier,其实我不知道,谢谢

标签: c++11 encryption aes cbc-mode


【解决方案1】:

我应该读取 cbc() 中的文件(包含用于加密的数据)还是可以读取 cbc() 之外的文件并将数据块作为协议传递给 cbc()?

您肯定希望将数据作为参数传递,以便 CBC 函数可以与其他数据源一起使用。你看,你不一定只加密一个文件,也许你会想在某个时候加密一些套接字传输。

哪一个是安全的实现?

这两个选项都可以安全地实施,也可以不安全地实施。 没有一种方法比另一种更安全,它实际上取决于实现本身。现在我不打算深入研究这里的安全问题,因为我相信你已经读过很多次了,编码你自己的任何加密算法的实现可能是并且大多数时候是不安全的,但你应该保留一件事请记住,这很容易做到 - 使用后擦拭缓冲区!例如,当您读取文件时,您将数据存储在某个向量或字符串中,这些向量或字符串将在其生命周期结束时被销毁,这没关系,但数据仍在内存中,它们没有被擦除。因此,如果您将指针指向数据,销毁向量并查看指针指向的数据,原始数据将仍然存在,直到该内存块不用于存储其他内容。您想为此使用一些自定义分配器。

如果您想要一些 CBC 实现的工作示例,可以查看 my CBC implementation。现在我不是专家,所以在实施时我可能会忽略一些可能的问题。

我如何知道文件加密时使用的初始化向量是什么。另外,如果我需要给用户静脉注射,怎么办?

初始化向量不是私有的,您可以简单地以任何您喜欢的方式存储它。例如,您可以将 IV 存储在加密文件本身中,这样用户就不必担心它。
类似:[IV][HMAC][CIPHER]

然后在解密时您可以读取“标头”,使用 HMAC 验证数据(它会告诉您提供的密码是否正确),然后解密数据。

【讨论】:

  • 您真的要在格式中包含[PADDING] 吗?这通常会附加到明文中,因此它最终会成为[CIPHER] 的一部分。还是您在这里使用填充用于其他目的?
  • 该死,你说得对,我不知道我在想什么!谢谢你的收获;-)
  • 你能提供一个 HMAC 实现吗,我没有足够的能力来实现它。谢谢
  • @ProXicT 我将 CBC 实现为void cbc(uint8_t plaintext[16], uint8_t output[16], uint8_t xorVector[16], uint8_t* keySchedule),基本上将数据块传递给函数,它还接受在应用密码操作之前对明文进行异或的数组,所以我想问一下正确接受 xorVector 作为争论,如果没有,如何存储先前函数调用的密文值以在当前函数调用中使用它
  • HMAC 实现也可以在the repository I posted 中看到。还有一个PBKDF 实现用于派生加密密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多