java - 加密文件的分隔符

标签 java encryption arrays

我正在创建一个java应用程序来使用Shamir的 secret 共享方案加密文件,并且由于我无法一次性加密整个文件,所以我想分段加密它 - 例如,一个int(四个字节)一次。基本上,将文件作为字节流读取,并一次加密 n 个字节。

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

最佳答案

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

前置长度

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

如果需要长度超过 255 字节的部分密文,则需要使用可变长度编码。 Apache Lucene 定义了例如 VInt .

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

分隔符

您仍然可以使用分隔符来执行此操作,但如果密文字节值分布均匀,则平均密文的放大程度会稍高。

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

结论

正如您所看到的,转义一个字节的概率是 256 中的 2。这与之前的可变长度整数的爆炸大致相同,但没有跳过的便利。实现难度从构建可变长度整数转移到正确转义密文字节。

关于java - 加密文件的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29444331/

相关文章:

java - 在java中解码md5加密

c++ - Arduino 中的字符串提取问题

c# - MemoryStream 到 String,然后返回到 MemoryStream,而不添加任何字节(编码等)

java - 明智地使用 bufferedReader

Java对称加密方法

iOS 数据保护和安全文件

数组大小为零时的 C++ 内存分配行为

java - 如何关闭多个JFrame和JDialog窗口?

java - 否定不适用于 .equalsIgnoreCase()

java - 第一次尝试后 TCP 套接字通信失败