目录

介绍

压缩

加密

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以下列方式用于加密/解密:

加密:纯文本(字节数组pXOR pad =>密文(字节数组x

解密:密文(xXOR 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);

测量

PCi7 2GHz 648

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库进行压缩和加密相关推荐

  1. python中符号计算输出数学_Python科学计算与数据处理—符号运算库.doc

    Python 科学计算与数据处理 - 符号运算库 符号运算库目录从示例开始欧拉恒等式球体体积数学表达 式符号数值运算符和函数符号运算表达式转换和简化方程目录微分 方程积分其他函数符号运算库. 它的目标 ...

  2. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  3. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )

    文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...

  4. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.完整代码示例 1.Java 层代码 2.JNI 层代码 3.日志头文件 4.执行结果 四.参考资料 前置博客 ...

  5. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...

  6. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

    文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...

  7. 用GSF(GNOME结构化文档库)库查看压缩文件的内容

    用GSF库查看压缩文件的内容                             GSF(GNOME结构化文档库)是一个读写复合文档的I/O高度抽象的链接库,在GNU LGPL条件下发布.依赖于g ...

  8. android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...

    zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...

  9. C# 关于压缩、加密、解压问题

    本文探讨的是关于C#TXT文件的压缩.加密以及解压问题,采用的是密钥方式,可以先进行加密再进行压缩包导入到桌面. 界面如下: 源文件:想要压缩的TXT文件,里边必须有东西,不然代码会报错 压缩文件:要 ...

最新文章

  1. Kali Linux python 安装pip
  2. [云炬创业基础笔记]第十一章创业计划书测试4
  3. java面向对象之封装,java面向对象之封装-Go语言中文社区
  4. (11)FPGA面试题同步复位与异步复位
  5. vue element container布局
  6. STM8单片机读取DHT11温湿度传感器
  7. (一)卡尔曼滤波算法简介
  8. 《Java技术》第六次作业
  9. RegularExpressions
  10. 泰迪杯数据分析比赛2018年B题解答
  11. 惠普bios硬重置_惠普BIOS密码重置工具下载_惠普重置BIOS下载 1.66 免费版_当载软件站...
  12. unity3d 台球源码_基于Unity3d的桌球游戏的设计与实现
  13. Linux系统安装sudo
  14. C语言学生宿舍水电费信息管理系统
  15. linux中竖线'|',双竖线‘||’,和的意思
  16. 视图之模板赋值和模板渲染
  17. matlab——整数规划
  18. 关闭/开启“此电脑”左边的导航栏win10
  19. Codeforces 1610C Keshi Is Throwing a Party
  20. 鼻炎的自我疗法【实用总结】

热门文章

  1. python 公司年会抽奖_Python语言学习之用Python写公司年会抽奖程序
  2. 新冠疫苗接种宣传海报PSD素材模板
  3. 万圣节海报素材PSD分层模板
  4. 手机海报模板,收藏就对了!
  5. UI素材|屏幕移动线框套件
  6. 【可临摹UI设计干货】APP UI界面的版式设计理论!
  7. creo打不开stp文件_让Creo输出的stp格式文件含有颜色设置 | 坐倚北风
  8. qt designer 自定义插件找不到指定的模块_go与qt的新酒老瓶
  9. 欢迎使用 QEMU 的文档!| 目录
  10. 使用 SYSENTER 和 SYSEXIT 指令执行对系统过程的快速调用