gpt4 book ai didi

java - CipherOutputStream 和 FileOutputStream(someFile, true) 在追加数据时产生垃圾

转载 作者:行者123 更新时间:2023-11-29 03:58:38 26 4
gpt4 key购买 nike

我在 Android 上使用 CipherOutputStream 通过 BufferedOutputStream 加密数据到 FileOutputStream(someFile, true)。我使用“AES/CBC/NoPadding”进行密码设置。目前常量 IV 和 key 。我在 Mac 上解密数据。编码和解码在此设置中运行良好。

但是当我重新打开加密文件并附加加密数据时,我在附加数据部分的开头得到了垃圾数据。这可能是某种用于加密数据的最小块大小的问题吗?

最佳答案

“CBC”代表“链式分组密码”。这意味着内容被分割成固定大小的 block ,每个 block 都被加密,但是 block 的加密形式依赖于它之前的所有 block

对于给定的 block 号 i,密文 c_i 从明文 block p_i 导出,如下所示:c_i = encrypt(p_i xor c_i-1)。 (对于第一个 block ,您与 IV 异或)。

假设您加密了三个 block ,您得到 c_1、c_2 和 c_3。如果您想向其添加第四个 block ,c_4 应等于 encrypt(p_4 xor c_3),但您实际添加的是 encrypt(p_4 xor IV) .

您需要添加的是encrypt(p_4 xor c_3),您应该恢复文件中的最后一个加密 block 并将其用作第一个附加 block 的IV。那应该可以正常工作。

但是,我们还没有讨论填充的问题。如果您的数据不能完全分为 block ,则最后一个 block 将在末尾进行一些填充。要正确存储数据,您应该解密最后一个 block (这将是一个简单的 block 解码,使用您的 key 和倒数第二个 block 的密文而不是 IV)并将其从文件中删除。用这个解密 block 作为新数据的前缀,然后按照上面的方法进行追加。

关于java - CipherOutputStream 和 FileOutputStream(someFile, true) 在追加数据时产生垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4877303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com