有效的数据处理:使用Tango库进行压缩和加密
目录
介绍
压缩
加密
Tango库
压缩
加密
使用压缩加密
在操作中
生成
测量
用于内存中gzip和lzma压缩的.NET库与基于强blakeb的流密码引擎结合使用。
- 下载Tango.zip - 910.6 KB
介绍
该项目为内存数据(如byte数组和MemoryStream)压缩和加密引入了一个自持的.NET库(dll)。当然,处理后的输出可以保存到硬盘中,但项目集中在有效的内存数据处理方方法上。
压缩
压缩的明显选择是内置的.NET GZip功能和7Zip SDK C#实现提供的LZM算法,这是迄今为止最有效的压缩功能。
由于项目的目的是直接内存转换,因此它不提供具有特定头结构的7Zip文件。该库调用GZip和LZM压缩算法,使用并行编程来缩小/扩充内存数据,以利用多个CPU内核。
库可用的压缩选项来自以下内容
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具有相同的含义)。
提供的功能的主要和唯一的目的是内存操作。因此保存到硬盘的单线程LZMA1压缩结果(字节数组)形成了可以使用7zip应用程序打开的正确7z文件,但多线程选项不能提供格式良好的7z文件。
加密
对于加密部分,该库引入了基于BlakeB压缩功能的快速流密码,由Samuel Neves,Christian Winnerlein和Uli Riehm实现。
BlakeB压缩功能在生成器的核心工作,该生成器在输入的键、盐(salt)和分布值中创建用户独有的输出字节数组(pad)。
生成的pad以下列方式用于加密/解密:
加密:纯文本(字节数组p)XOR pad =>密文(字节数组x)
解密:密文(x)XOR pad =>纯文本(p)
由于加密和解密功能都只是使用pad对字节进行异或,因此密码引擎包括覆盖这两种情况的单个函数Crypt,并为我们提供了流密码实现。
发生器(程序中的BGen类)和流密码(程序中的Streamer类)都使用多核处理器以并行模式工作。
例如,如果机器有8个处理器,则生成器将生成8个并行阵列并将它们粘合到单个输出(pad)中。不用说,这些数组保证是独一无二的,不会重复。
类似地,Streamer将输入流分成8个部分,与填充的8个相应部分进行异或,并产生汇总结果。
让我们对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)));v1 = v1 + v5 + m2;v13 = v13 ^ v1;v13 = ((v13 >> 32) | (v13 << (32)));v9 = v9 + v13;v5 = v5 ^ v9;v5 = ((v5 >> 24) | (v5 << (40)));v1 = v1 + v5 + m3;v13 = v13 ^ v1;v13 = ((v13 >> 16) | (v13 << (48)));v9 = v9 + v13;v5 = v5 ^ v9;v5 = ((v5 >> 63) | (v5 << (1)));
...
具有重复的移位常数32,24,16和63.每个常数在12轮处理中出现96次,总共384次。
为了使对手的生活更有趣,当前的实现最初基于用户密码(密钥),盐(salt)和分布输入生成字节数组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));
}
因此,压缩函数利用取决于用户输入的密钥,盐(salt)和分布的唯一组384个移位数(字节),从而消除来自计算的任意常数。
生成器中唯一的常量是程序员定义的ulongs:
private const ulong IV0 = 9111111111111111111;
private const ulong IV1 = 8222222222222222222;
private const ulong IV2 = 7333333333333333333;
private const ulong IV3 = 6444444444444444444;
private const ulong IV4 = 5555555555555555555;
private const ulong IV5 = 4666666666666666666;
private const ulong IV6 = 3777777777777777777;
private const ulong IV7 = 2888888888888888888;
private const ulong IV8 = 1999999999999999999;
private const ulong IV9 = 1111111111111111111;
private const ulong IV10 = 2222222222222222222;
private const ulong IV11 = 3333333333333333333;
private const ulong IV12 = 4444444444444444444;
private const ulong IV13 = 5555555555555555555;
private const ulong IV14 = 6666666666666666666;
private const ulong IV15 = 7777777777777777777;private const ulong FNL0 = 123456789;
private const ulong FNL1 = 987654321;
在您的实现中设置唯一常量,并享受可靠灵活的个人流密码,其中没有任何外部预定义。
用户提供的盐(salt)和分布输入会影响生成器的初始状态,因此会增加结果的分散。
Tango库
Tango库的Tang类是一个单一的入口点,具有仅用于压缩、仅用于加密或同时用于两者的接口。
这是构造函数用法示例。
压缩
Tang tang1 = new Tang(CompressionAlgo.GZip1); // use GZip on 1 processorTang tang2 = new Tang(CompressionAlgo.LZMA8); // use LZMA on 8 processors
加密
Tang<code> </code>tang3 = new Tang("key", "salt", "distr", 1); // use 1 processor for encryptionTang tang4 = new Tang(key, salt, distr); // use all processors for encryption. key,salt and distr are byte arrays
使用压缩加密
Tang tang5<code> </code>= new Tang(CompressionAlgo.GZip8, "key", "salt", "distr", 4); // GZip8 compression, 4 processors for encryptionTang tang6 = new Tang(CompressionAlgo.LZMA1, "key", "salt", "distr"); // LZMA1 compression, all processors for encryption
在操作中
Tang tang1<code> </code>= new Tang(CompressionAlgo.GZip1);byte[] plain = ...byte[] compressed = tang1.Zip(plain);
byte[] uncompressed = tang1.Unzip(compressed);Tang tang<code>2 </code>= new Tang("key", "salt", "distr");byte[] encrypted= tang2.Crypt(plain);// The reset is needed when using the same tang object for the paired encrypt/decrypt and tangle/untangle actions.tang2.Reset();byte[] decrypted = tang2.Crypt (encrypted);Tang tang3<code> </code>= new Tang(CompressionAlgo.LZMA1, "key", "salt", "distr");byte[] tangled = tang3.Tangle(plain); // Tangle is Crypt(Zip(plain))tang3.Reset();byte[] untangled = tang3.Untangle(tangled); // Untangle is Unzip(Crypt(tangled))
还有Tango函数使用MemoryStream输入参数,而不是字节数组作为参数。
不要忘记在un-unzip和Untangle操作中放置try / catch块。
生成
初始化后,tang对象可以生成给定长度的字节数组,该字节数组对于提供的密钥,盐(salt)和分布是唯一的:
Tang tang = new Tang("key", "salt", "distr");
byte[] hash = tang.Generate(<code>int </code>length);
测量
PC:i7 2GHz 64位8核
Tangle()
Source 9,653,618 B (fb2 file - allows for high compression)
time compression rate
GZip1 2,463,446 B 1259 ms 25.52%
GZip8 2,472,430 B 303 ms 25.61%
LZMA1 1,777,219 B 30995 ms 18.41%
LZMA8 1,914,649 B 6124 ms 19.83%
仅限压缩
Source 9653618 B timing compression rate
GZip1 2,463,446 B 1169 ms 3.7% 25.52%
GZip8 2,472,430 B 293 ms 0.9% 25.61%
LZMA1 1,777,219 B 31377 ms 100% 18.41%
LZMA8 1,914,649 B 6131 ms 19.5% 19.83%
预期最有效的压缩算法是LZMA1,它具有最高的时间成本。
GZip8比GZip1快4倍,压缩效果几乎不差。
仅限加密
Source 9653618 B
time
1 core 903 ms 100%
2 cores 457 ms 50.6%
4 cores 295 ms 32.7%
8 cores 219 ms 24.3%
生成
250毫秒内生成10,000,000个字节
初始化速度
<code>Tang tang </code>= new <code>Tang </code>(CompressionAlgo.LZMA8, "key", "salt", "distr");
Tang构造时间大约需要0.08 ms,与应用的压缩算法无关。
让您轻松与Tango纠缠在一起!
原文地址:https://www.codeproject.com/Articles/1273094/Effective-data-handling-compress-and-encrypt-with
有效的数据处理:使用Tango库进行压缩和加密相关推荐
- python中符号计算输出数学_Python科学计算与数据处理—符号运算库.doc
Python 科学计算与数据处理 - 符号运算库 符号运算库目录从示例开始欧拉恒等式球体体积数学表达 式符号数值运算符和函数符号运算表达式转换和简化方程目录微分 方程积分其他函数符号运算库. 它的目标 ...
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...
- 用GSF(GNOME结构化文档库)库查看压缩文件的内容
用GSF库查看压缩文件的内容 GSF(GNOME结构化文档库)是一个读写复合文档的I/O高度抽象的链接库,在GNU LGPL条件下发布.依赖于g ...
- android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...
zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...
- C# 关于压缩、加密、解压问题
本文探讨的是关于C#TXT文件的压缩.加密以及解压问题,采用的是密钥方式,可以先进行加密再进行压缩包导入到桌面. 界面如下: 源文件:想要压缩的TXT文件,里边必须有东西,不然代码会报错 压缩文件:要 ...
最新文章
- Kali Linux python 安装pip
- [云炬创业基础笔记]第十一章创业计划书测试4
- java面向对象之封装,java面向对象之封装-Go语言中文社区
- (11)FPGA面试题同步复位与异步复位
- vue element container布局
- STM8单片机读取DHT11温湿度传感器
- (一)卡尔曼滤波算法简介
- 《Java技术》第六次作业
- RegularExpressions
- 泰迪杯数据分析比赛2018年B题解答
- 惠普bios硬重置_惠普BIOS密码重置工具下载_惠普重置BIOS下载 1.66 免费版_当载软件站...
- unity3d 台球源码_基于Unity3d的桌球游戏的设计与实现
- Linux系统安装sudo
- C语言学生宿舍水电费信息管理系统
- linux中竖线'|',双竖线‘||’,和的意思
- 视图之模板赋值和模板渲染
- matlab——整数规划
- 关闭/开启“此电脑”左边的导航栏win10
- Codeforces 1610C Keshi Is Throwing a Party
- 鼻炎的自我疗法【实用总结】
热门文章
- python 公司年会抽奖_Python语言学习之用Python写公司年会抽奖程序
- 新冠疫苗接种宣传海报PSD素材模板
- 万圣节海报素材PSD分层模板
- 手机海报模板,收藏就对了!
- UI素材|屏幕移动线框套件
- 【可临摹UI设计干货】APP UI界面的版式设计理论!
- creo打不开stp文件_让Creo输出的stp格式文件含有颜色设置 | 坐倚北风
- qt designer 自定义插件找不到指定的模块_go与qt的新酒老瓶
- 欢迎使用 QEMU 的文档!| 目录
- 使用 SYSENTER 和 SYSEXIT 指令执行对系统过程的快速调用