关于AES(CBC)和IV的问题(是否可以继续使用aes(CBC)加密?,...)

Ben*_*Ben 1 c# encryption aes

我对C#和加密相对较新,所以请耐心等待.我正在写一些数据到一个文件,我想用Aes(CBC)对它进行加密,但我每天都会得到新数据,我想把每周,每月,每年的所有数据写入一个文件,这取决于关于内容.因此,"服务器"肯定会重新启动/关闭(它不会是真正的服务器),我想知道是否有可能以某种方式获取(并保存到文件)我可以使用的最新初始化向量重新启动继续加密数据并将其写入同一文件.因此,当我解密文件时,我会在某个地方获取文件的静脉注射,并且可以使用那个iv解密它?

伪代码:

加密:

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

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

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

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

解密:

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

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

解密不应该注意到,加密是以往任何时候停止和应用退出,......我有不知道如何实现这一目标,如何获取"特殊IV".但我认为应该可以实现.

你怎么看,有没有合理的方法来获得特殊的iv?关于如何做的任何想法?

非常感谢你的时间和答案.

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

Hen*_*sma 5

要在CBC模式下解密任何块,您只需要先前的加密块:明文将是"当前块XOR先前密码块的AES解密".在加密时,您只会将块大小的倍数写入文件,因为这是CBC的工作方式.当你开始加密时,所以当你开始填充文件时,你必须选择一个IV(随机,对于你创建的每个文件都是不同的,所以它取决于时间或某些东西),你把它写成文件作为第一个"密文块",然后对于每个实际数据块,你将它与文件中的前一个块(最初是IV)进行异或,然后使用块密码进行加密.当您以后获得新数据时,我们只使用您已有的最后一个块.

微妙的一点:因为你只写了多个块,你需要填充.这样做可以让你知道填充的字节数和"真实数据"的字节数.当您开始下一批数据时,您应该以某种方式标记前一个块结束了"数据单元",这样您就知道,在解密时,您知道需要删除填充以获取实际数据的块.所以你需要一些包装器,或者数据的内部结构(格式)总能使它明确无误.这是值得注意的.