压缩和加密数据到块

时间:2012-02-14 21:57:51

标签: c# encryption compression file-structure

我正在研究压缩和加密系统,我遇到了一些障碍,我认为我可以通过与一些专业人士一起思考来解决这个障碍。

目标

我想要一个能够容纳多种类型文件的文件容器系统。我希望能够根据将在压缩/加密时定义的某些规则压缩(LZF)并加密(AES)以及存储在文件头。我希望能够从这个容器中检索文件作为流。这意味着必须以块为单位压缩/加密文件才能按顺序读取它们。否则,我必须解密,然后立即将整个文件解压缩到内存中,我希望这个过程尽量少占用内存。

当前状态

我已经完成了标题系统,其中包含有关容器本身,文件表和所有文件信息的信息。我目前正在编写文件写入流来创建实际的容器。

问题

在完成这个过程的过程中,我一直试图弄清楚如何将文件的数据压缩成字节数组,然后用块加密。我认为我已经确定了1024字节块,这意味着将是64块AES加密数据,这些数据将被存储,因为AES在128位块中加密。整个系统将使用流设置。这意味着我无法控制将多少数据发送到我的系统。我的问题是,在压缩数据时,我完全不知道我压缩的数据有多大。我可以更小,相同尺寸甚至比原始尺寸更大。我需要知道如何在块中成功解压缩数据。

问题示例

假设我有一个128字节的信息块,我想加密,压缩并保存到我所描述的系统中。我会将它写入流,然后将其压缩。还可以说128字节块被压缩到64字节块。然后我发送另一个长度为256的块,它被压缩到128个字节。这两个块都被复制到一个缓冲区中,然后新的384字节缓冲区将被加密,这将产生(24)16字节块。然后它将以1024字节块写入容器系统。

在这个例子中,我没有解密信息,因为它们是块状的,但我不能说同样的解压缩步骤。根据我对压缩的理解,如果我尝试解密压缩的64和128字节块,我将会有无效数据,因为它们最初是单独压缩的。如果需要更多说明,请告诉我。

1 个答案:

答案 0 :(得分:1)

当您从流中读取数据时,您将获得字节数。仅在最后一个块上,它将小于块大小。这是你调用WriteFinalBlock并让加密器进行填充的信号。