Java 加密文件的分隔符

Java 加密文件的分隔符,java,encryption,bytearray,Java,Encryption,Bytearray,我正在创建一个java应用程序来使用Shamir的秘密共享方案加密文件,因为我不能一次性加密整个文件,所以我希望对其进行分段加密—例如,一次加密一个int(四个字节)。基本上,以字节流的形式读取文件,并一次加密n个字节 问题是,加密的部分可能比输入的部分大,也可能小。因此,我可以得到一个四字节的值,加密为五个字节,等等。这意味着我不能简单地连接所有加密的片段来创建加密文件-我需要一些方法来划分片段。有什么好方法可以做到这一点呢?在不了解任何密文域的情况下,假设每个字节值都可以在密文中,我建议使用

我正在创建一个java应用程序来使用Shamir的秘密共享方案加密文件,因为我不能一次性加密整个文件,所以我希望对其进行分段加密—例如,一次加密一个int(四个字节)。基本上,以字节流的形式读取文件,并一次加密n个字节


问题是,加密的部分可能比输入的部分大,也可能小。因此,我可以得到一个四字节的值,加密为五个字节,等等。这意味着我不能简单地连接所有加密的片段来创建加密文件-我需要一些方法来划分片段。有什么好方法可以做到这一点呢?

在不了解任何密文域的情况下,假设每个字节值都可以在密文中,我建议使用前置策略

预弯长度 您应该在每个加密整数前加上一个字节,以显示下一个部分密文的长度。对于长度为4和5的部分密文,您将得到六分之一到五分之一的密文放大。这也适用于长度不超过255字节的部分密文

如果需要长度超过255字节的部分密文,则需要可变长度编码。ApacheLucene定义了例如

这种编码的好处是,如果底层流支持跳过,则可以轻松跳过长的部分密文而不读取它们。使用分隔符是不可能的

分隔符 您仍然可以使用分隔符来执行此操作,但如果密文字节值分布是一致的,则它的平均密文放大倍数将略高

以分隔符字节0x00为例。它对每个部分密文进行定界,但密文本身也可能包含0x00字节。现在需要将0x00密文字节转义为0xFF00,将每个0xFF转义为0xFFFF。如果现在遇到单个0x00字节,则可以确保它是一个分隔符,如果遇到0xFF00或0xFFFF,则将其转换为密文的0x00或0xFF

结论 如您所见,转义一个字节的概率是256分之二。这与之前的可变长度int大致相同,但不方便跳过。实现的困难从构建可变长度的整数转移到正确地取消加密文本字节。

可能的解决方案:
加密后,数据大小是已知的。 按以下格式创建字节结构:

{使用整数的长度}{加密数据}{使用整数的长度}{加密数据}


因此,当您开始读取要解密的数据时,首先读取长度,然后读取长度中提到的字节数,依此类推。

标准解决方案是根据加密块的大小为其添加前缀。 如果要减小最终文件大小,可以使用一个字节来存储下一个加密块的大小,而不仅仅是每个int的大小。例如:…
如果块的长度可以超过255个字节,则可以使用变量structure存储大小(无符号):在0到127的一个字节上,在128到32767的两个字节上,依此类推。

秘密共享方案本身不是加密方案。你需要一些别的东西来制作加密算法。如果某个东西生成的字节可以是任何值,那么就不能使用分隔符。是的!如果我使用更大的碎片,爆炸会进一步减少。这应该是可行的。如果你想加密那些导致部分密文大于255字节的块,你可以尝试一些类似于没有Z字形的东西。