Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CipherOutputStream和FileOutputStream(someFile,true)在追加数据时会导致垃圾_Java_Android_Filestream_Aes_Cryptography - Fatal编程技术网

Java CipherOutputStream和FileOutputStream(someFile,true)在追加数据时会导致垃圾

Java CipherOutputStream和FileOutputStream(someFile,true)在追加数据时会导致垃圾,java,android,filestream,aes,cryptography,Java,Android,Filestream,Aes,Cryptography,我用一个CipherOutputStream在Android上加密数据,通过一个BufferedOutputStream到一个FileOutputStreamsomeFile,真的。我使用AES/CBC/NoPadding进行密码设置。目前恒定IV和键。我解密Mac上的数据。编码和解码在此设置下工作良好 但是当我重新打开加密文件并附加加密数据时,我在附加数据部分的开头得到了垃圾数据。这可能是加密数据的某种最小块大小的问题吗?追加时,是否正在创建新的密码实例,并使用创建文件时使用的IV初始化它?那

我用一个CipherOutputStream在Android上加密数据,通过一个BufferedOutputStream到一个FileOutputStreamsomeFile,真的。我使用AES/CBC/NoPadding进行密码设置。目前恒定IV和键。我解密Mac上的数据。编码和解码在此设置下工作良好


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

追加时,是否正在创建新的密码实例,并使用创建文件时使用的IV初始化它?那不行

如果创建一个新的密码实例进行追加,则需要将其IV设置为文件中的最后一个密码文本块


在CBC中,前一个密文块在加密之前与纯文本异或。在文件的开头,没有先前的密码文本块,因此您可以创建一个:IV。但是所有后续的块都有一个先前的块,如果您在中间流中追加数据,则需要将其用作IV。

追加时,是否创建新的密码实例,然后用你创建文件时用的IV初始化它?那不行

如果创建一个新的密码实例进行追加,则需要将其IV设置为文件中的最后一个密码文本块


在CBC中,前一个密文块在加密之前与纯文本异或。在文件的开头,没有先前的密码文本块,因此您可以创建一个:IV。但是所有后续的块都有一个先前的块,如果您在中流附加数据,则需要将其用作IV。

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

对于给定的块号i,密文c_i由明文块p_i导出,如下所示:c_i=encryptp_i xor c_i-1。对于第一个块,使用IV进行异或

假设对三个块进行加密,得到c_1、c_2和c_3。如果您想在其上附加第四个块,那么c_4应该等于encryptp_4 xor c_3,但您实际添加的是encryptp_4 xor IV

您需要添加的是encryptp_4 xor c_3,您应该恢复文件中最后一个加密的块,并将其用作第一个附加块的IV。那就行了


但是,我们还没有讨论填充的问题。如果数据不能精确地划分为块,那么最后一个块的末尾将有一些填充。为了正确地存储数据,您应该使用密钥对最后一个块(简单的块解码)以及倒数第二个块(而不是IV)的密码文本进行解密,并将其从文件中删除。用这个解密的块作为新数据的前缀,然后如上所述进行追加。

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

对于给定的块号i,密文c_i由明文块p_i导出,如下所示:c_i=encryptp_i xor c_i-1。对于第一个块,使用IV进行异或

假设对三个块进行加密,得到c_1、c_2和c_3。如果您想在其上附加第四个块,那么c_4应该等于encryptp_4 xor c_3,但您实际添加的是encryptp_4 xor IV

您需要添加的是encryptp_4 xor c_3,您应该恢复文件中最后一个加密的块,并将其用作第一个附加块的IV。那就行了


但是,我们还没有讨论填充的问题。如果数据不能精确地划分为块,那么最后一个块的末尾将有一些填充。为了正确地存储数据,您应该使用密钥对最后一个块(简单的块解码)以及倒数第二个块(而不是IV)的密码文本进行解密,并将其从文件中删除。使用此解密块为新数据添加前缀,然后按上述方式进行追加。

感谢您的快速回答!我只是忽略了一个事实,即在向文件添加数据时,会再次使用初始IV。感谢您的快速回答!我只是忽略了这样一个事实,即在向文件添加数据时会再次使用初始IV。感谢您对填充问题的快速回答和解决方案!我会尝试一下。也许设计一种方法可以更容易地删除邮件中间的填充,这样你就可以只附加,而不是删除+附加。这可能会让你面临微妙的填充攻击,虽然强调了可能,但这超出了我的知识范围。从加密安全的角度来看,我不知道哪一个更好。也许是一种新的风格
关于那个话题的话题P我可能会按照我在帖子中所说的去做,而不是把填充物留在里面。谢谢你快速的回答和填充问题的解决方案!我会尝试一下。也许设计一种方法可以更容易地删除邮件中间的填充,这样你就可以只附加,而不是删除+附加。这可能会让你面临微妙的填充攻击,虽然强调了可能,但这超出了我的知识范围。从加密安全的角度来看,我不知道哪一个更好。也许是关于这个话题的新问题P我可能会按照我在帖子里说的去做,而不是把填充物留在里面。