我对C#和加密比较陌生,所以请耐心等待。我正在写一些数据到一个文件,我想用Aes(CBC)对它进行加密,但我每天都会得到新数据,我想把每周,每月,每年的所有数据写入一个文件,这取决于关于内容。因此,“服务器”肯定会重新启动/关闭(它不会是一个真正的服务器),我想知道是否有可能以某种方式获取(并保存到文件)我可以使用的最新初始化向量重新启动继续加密数据并将其写入同一文件。所以,当我解密文件时,我会在某个地方获取文件的静脉,并且只能用那个iv解密它?
伪代码:
加密:
1。)根据iv和密钥加密数据
2。)数据流停止后,“特殊iv”被保存到另一个文件
3。)数据流停止,一段时间过去,“服务器”关闭或重新启动
4。)从文件中读取“特殊iv”并继续加密 3.和4.循环一周,一个月,一年
解密:
1。)从该文件读取(以某种方式获取)iv和密钥
2。)用iv和密钥
解密文件解密不应该注意到加密一直停止并且应用程序退出,...... 我不知道如何实现这一点,如何获得“特殊iv”。但我认为这应该是可以实现的。
您如何看待,是否有合理的方式获得特殊的iv?关于如何做的任何想法?
非常感谢你的时间和答案。
编辑:我正在使用.NET的.NET(4.0)实现,如果可能,我更愿意使用它答案 0 :(得分:5)
要在CBC模式下解密任何块,您只需要先前的加密块:明文将是“当前块XOR先前密码块的AES解密”。 在加密时,您只会将块大小的倍数写入文件,因为这是CBC的工作方式。当你开始加密时,所以当你开始填充文件时,你必须选择一个IV(随机,对于你创建的每个文件都是不同的,所以让它取决于时间或某些东西),你把它写成文件作为第一个“密文块”,然后对于每个实际数据块,你将它与文件中的前一个块(最初是IV)进行异或,然后使用块密码进行加密。当您稍后获得新数据时,我们只使用您已有的最后一个块。
细微点:因为你只写了多个块,你需要填充。这样做可以让你知道填充的字节数和“真实数据”的字节数。当您开始下一批数据时,您应该以某种方式标记前一个块结束了“数据单元”,这样您就知道,在解密时,您知道需要删除填充以获取实际数据的块。所以你需要一些包装器,或者数据的内部结构(格式)总能使它明确无误。这是值得注意的。
答案 1 :(得分:1)
您所指的“特殊IV”只是加密一天数据时的当前IV;您的加密库应该能够提供给您。块的解密只需要该块的密钥和IV,因此您可以保存(比方说)每天的IV以解密其数据。
答案 2 :(得分:0)
你的建议实际上并不完全安全。潜在攻击的描述在 论文“Gregory V. Bard对SSL的一种具有挑战性但可行的块状自适应选择性明文攻击”。
问题在于CBC要求攻击者无法预测IV。但是,如果您对明文进行分段加密,则攻击者可能会学习最新的密文块,该块将基本上用作下一个加密的块的IV,因此违反了要求。本文包含一些例子,当攻击可行时,但当然正如文章所说,它不容易被利用。 仍然可能更好的是使用例如CTR模式,其没有此限制。