在现代计算中,内存数据的处理变得越来越重要。随着数据量的增加和处理速度的要求,有效的内存数据压缩和加密技术变得至关重要。本文将介绍一种专注于内存数据压缩和加密的库,该库利用了.NET的GZip功能和7zip SDK的LZM算法,以及基于BlakeB压缩函数的加密实现。
压缩是数据存储和传输中的一项关键技术,它能够减少数据占用的空间,从而提高效率。在内存数据处理中,压缩同样重要。本文介绍的库提供了多种压缩算法,包括GZip和LZMA。GZip是.NET内置的压缩功能,而LZMA算法则是通过7zip SDK的C#实现提供的。这些算法能够高效地在内存中进行数据压缩和解压缩。
该库的压缩选项包括:
public enum CompressionAlgo {
GZip_All,
GZip1,
GZip2,
GZip4,
GZip8,
LZMA_All,
LZMA1,
LZMA2,
LZMA4,
LZMA8,
None
}
其中,数字1、2、4、8代表参与压缩的处理器数量。GZip_All和LZMA_All代表使用所有可用的机器处理器(通常等于8),因此LZMA_All和LZMA8具有相同的含义。
数据的安全性是另一个重要的考虑因素。本文介绍的库引入了基于BlakeB压缩函数的快速流密码。BlakeB压缩函数是生成器的核心,它创建了与用户输入的密钥、盐值和分布值唯一对应的输出字节数组(填充)。
加密和解密的过程如下:
加密:明文(字节数组p)XOR填充 => 密文(字节数组x)
解密:密文(x)XOR填充 => 明文(p)
由于加密和解密函数都是通过XOR字节与填充来实现的,因此密码引擎包括了一个单一的函数Crypt,涵盖了这两种情况,并提供了流密码的实现。
BlakeB函数的核心压缩功能由以下块组成:
v0 = v0 + v4 + m0;
v12 = v12 ^ v0;
v12 = ((v12 >> 32) | (v12 << (32)));
v8 = v8 + v12;
v4 = v4 ^ v8;
v4 = ((v4 >> 24) | (v4 << (40)));
v0 = v0 + v4 + m1;
v12 = v12 ^ v0;
v12 = ((v12 >> 16) | (v12 << (48)));
v8 = v8 + v12;
v4 = v4 ^ v8;
v4 = ((v4 >> 63) | (v4 << (1)));
为了增加对手的难度,当前实现最初基于用户密码(密钥)、盐值和分布输入生成字节数组S[384]。这允许在压缩函数中使用以下模式:
int i = 0;
v0 = v0 + v4 + m0;
v12 = v12 ^ v0;
v12 = RR(v12, S[i++]);
v8 = v8 + v12;
v4 = v4 ^ v8;
v4 = RR(v4, S[i++]);
v0 = v0 + v4 + m1;
v12 = v12 ^ v0;
v12 = RR(v12, S[i++]);
v8 = v8 + v12;
v4 = v4 ^ v8;
v4 = RR(v4, S[i++]);
...
其中RR是右旋转函数:
private ulong RR(ulong x, byte n) {
return (x >> n) | (x << (-n & 63));
}
因此,压缩函数利用了基于用户输入的密钥、盐值和分布的384个独特的位移数(字节),从而消除了计算中的任意常数。
Tango库的Tang类是单一的入口点,提供了压缩、加密或两者兼有的接口。以下是构造函数的使用示例:
Tang tang1 = new Tang(CompressionAlgo.GZip1); // 使用1个处理器进行GZip压缩
Tang tang2 = new Tang(CompressionAlgo.LZMA8); // 使用8个处理器进行LZMA压缩
Tang tang3 = new Tang("key", "salt", "distr", 1); // 使用1个处理器进行加密
Tang tang4 = new Tang(key, salt, distr); // 使用所有处理器进行加密
Tang类还提供了使用MemoryStream输入参数而不是字节数组的函数。
以下是在i7 2GHz 64位8核PC上的性能测量结果:
压缩时间、压缩率:
加密时间(单核):
生成10,000,000字节的时间:250毫秒