我有一个AES密码的实现,用于128,192和256位密钥。我正在尝试实现分组密码操作模式,目前正在实现密码块链接模式。
关于CBC模式的实施我有两个问题:
1。这是关于将数据提供给密码例程,我在cbc()\\this function implements cbc mode
中调用密码例程。我的问题是我应该在cbc()
中读取文件(包含加密数据),或者我可以在cbc()
之外读取文件,并将数据块作为agruement传递给cbc()
。哪一个是安全的实施。
2。 CBC模式需要一个随机生成的初始化矢量即IV(我在c ++ 11中使用随机字节发生器),因为用户只在加密/解密时输入密钥,我怎么知道使用的初始化矢量是什么文件加密时。另外,如果我需要向用户提供IV,怎么做?
我在C ++ 11中实现这些。
感谢。
答案 0 :(得分:2)
我是否应该在cbc()中读取文件(包含加密数据),或者我可以在cbc()之外读取文件并将数据块作为agruement传递给cbc()?
您肯定希望将数据作为参数传递,以便CBC函数可以与其他数据源一起使用。你看,你不一定只加密一个文件,也许你想在某个时候加密一些套接字传输。
哪一个是安全实施?
这两个选项都可以安全地实施,也可以不安全地实施。 没有一种方法比另一种方法更安全,它实际上取决于实现本身。现在我不打算深入研究这里的安全问题,因为我相信你已经多次读过编写你自己的任何加密算法的实现可能并且大部分时间都是不安全的,但有一件事你应该记住,哪个很容易做到 - 使用它们后擦拭缓冲区!例如,当您读取文件时,将数据存储在某个向量或字符串中,这将在其生命周期结束时被销毁,这没关系,但数据仍然在内存中,它们没有被擦除。因此,如果您对数据采用指针,销毁向量并查看指针指向的数据,原始数据仍将存在,直到此存储块不用于存储其他内容。您想为此使用一些自定义分配器。
如果您想了解CBC实施的一些实例,可以查看my CBC implementation。现在我不是专家,所以在实施这个问题时我可能会忽略一些可能的问题。
如何知道文件加密时使用的初始化向量是什么。另外,如果我需要向用户提供IV,怎么做?
初始化向量不是私有的,您只需以您喜欢的任何方式存储它。例如,您可以将IV存储在加密文件中,这样用户就不用担心了。
类似的东西:[IV] [HMAC] [CIPHER]
然后在解密时,您可以阅读"标题",使用HMAC验证数据(告诉您提供的密码是否正确),然后解密数据。