首页 > 解决方案 > AES的CBC操作模式的实现

问题描述

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

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

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

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

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

谢谢。

标签: c++11encryptionaescbc-mode

解决方案


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

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

哪一个是安全的实现?

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

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

我怎么知道加密文件时使用的初始化向量是什么。另外,如果我需要将 IV 提供给用户,怎么办?

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

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


推荐阅读