【问题标题】:Q about AES (CBC) and IV (Is it possible to continue with aes(CBC) encryption? ,... )Q 关于 AES (CBC) 和 IV (是否可以继续使用 aes(CBC) 加密?,...)
【发布时间】:2011-07-03 01:01:10
【问题描述】:

我对 C# 和加密比较陌生,所以请多多包涵。我正在将一些数据写入文件,我想使用 Aes (CBC) 对其进行加密,但我每天都会获取新数据,并且我想每周、每月、每年将所有数据写入一个文件,这取决于在内容上。因此,“服务器”肯定会重新启动/关闭(它不会是真正的服务器),我想知道是否有可能以某种方式获取(并保存到文件)我可以使用的最新初始化向量重新启动继续加密数据并将其写入同一文件。这样当我解密文件时,我就可以在某个地方得到文件的 iv 并且可以只用那个 iv 解密它?

伪代码:

加密:

1.) 根据iv和key加密数据

2.) 数据流停止后,“特殊 iv”被保存到另一个文件中

3.) 数据流停止,一段时间过去,“服务器”被关闭或重新启动

4.) 从文件中读取“特殊 iv”并继续加密 3. 和 4. 循环一周、一个月、一年

解密:

1.) 从该文件中读取(以某种方式获得)iv 和密钥

2.) 使用该 iv 和密钥解密文件

解密不应注意到加密曾经停止并且应用程序退出,... 我不知道如何实现这一点,如何获得“特殊 iv”。不过我觉得这应该是可以实现的。

你觉得有什么合理的方法可以获得那个特殊的iv吗?关于如何做到这一点的任何想法?

非常感谢您的时间和回答。

编辑:我正在使用 AES 的 .NET (4.0) 实现,如果可能的话,我更愿意使用它

【问题讨论】:

    标签: c# aes encryption


    【解决方案1】:

    您所指的“特殊IV”只是加密一天数据结束时的当前IV;您的密码库应该能够提供给您。解密一个块只需要该块的密钥和 IV,因此您可以保存(例如)每天的 IV 来解密其数据。

    【讨论】:

    • 我可能弄错了,但是当使用 CBC 时,您的写入必须匹配块大小边界才能继续写入流。您要么需要填充最终块,要么使用解决此问题的 CFB。
    • @Sparkie:你是对的。 OP 需要确保每天的条目在 AES 块边界处结束。
    【解决方案2】:

    要在 CBC 模式下解密任何块,您只需要前一个加密块:明文将是“当前块的 AES 解密 XOR 前一个密码块”。 加密时,您只会将块大小的倍数写入文件,因为这就是 CBC 的工作方式。当您开始加密时,因此当您开始填充文件时,您必须选择一个 IV(随机,对于您创建的每个文件都不同,因此使其取决于时间或类似的东西),您将其写入文件作为首先是“密文块”,然后对于每个实际数据块,您将其与文件中的前一个块(一开始是 IV)进行异或,然后使用您的块密码进行加密。当您稍后获得新数据时,我们只使用您已经拥有的最后一个块。

    微妙之处:由于您只编写多个块,因此您需要填充。让它知道有多少字节是填充的,有多少字节是“真实数据”。当你从下一批数据开始时,你应该以某种方式标记上一个块结束了一个“数据单元”,这样你就知道在解密的时候,你知道你需要删除哪些块的填充来获取实际数据.因此,您需要对其进行一些包装,否则数据(格式)的内部结构将始终使这一点明确。这是需要注意的事情。

    【讨论】:

      【解决方案3】:

      您的建议实际上并不完全安全。潜在攻击的描述在 Gregory V. Bard 的论文“对 SSL 的具有挑战性但可行的块自适应选择明文攻击”。

      问题在于 CBC 要求攻击者无法预测 IV。但是,如果您分段加密明文,那么攻击者可能会学习到最新的密文块,该块基本上将用作下一个加密块的 IV,因此违反了要求。该论文包含一些示例,当攻击可行时,但当然正如论文所说,它不容易被利用。 还是使用没有这个限制的 CTR 模式可能会更好。

      【讨论】:

        猜你喜欢
        • 2013-08-11
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2022-11-16
        • 2015-09-16
        • 1970-01-01
        相关资源
        最近更新 更多