Networking &引用;“不可压缩”;数据序列

Networking &引用;“不可压缩”;数据序列,networking,compression,vpn,data-compression,Networking,Compression,Vpn,Data Compression,我想通过一个算法生成一个X MB的“不可压缩”数据序列。我希望这样做是为了创建一个通过VPN连接测量网络速度的程序(避免VPN内置压缩) 有人能帮我吗?谢谢 我需要一个算法,我使用了一个压缩到无法再压缩的文件,但现在我需要通过编程从头开始生成数据序列。创建统计上难以压缩的数据的一个简单方法就是使用随机数生成器。如果你需要它是可重复的,修复种子。任何相当好的随机数生成器都可以。具有讽刺意味的是,如果你知道随机数生成器,结果是难以置信的可压缩的:唯一存在的信息是种子。但是,它将击败任何真正的压缩方法

我想通过一个算法生成一个X MB的“不可压缩”数据序列。我希望这样做是为了创建一个通过VPN连接测量网络速度的程序(避免VPN内置压缩)

有人能帮我吗?谢谢


我需要一个算法,我使用了一个压缩到无法再压缩的文件,但现在我需要通过编程从头开始生成数据序列。

创建统计上难以压缩的数据的一个简单方法就是使用随机数生成器。如果你需要它是可重复的,修复种子。任何相当好的随机数生成器都可以。具有讽刺意味的是,如果你知道随机数生成器,结果是难以置信的可压缩的:唯一存在的信息是种子。但是,它将击败任何真正的压缩方法。

您有两种选择: 1.使用合适的伪随机数生成器 2.使用AES之类的加密功能(随处可见的实现)

阿尔戈

  • 拿出你想要的钥匙。全是零就可以了
  • 创建一个空块
  • 使用密钥加密块
  • 输出块
  • 如果需要更多数据,请转到3

  • 如果操作正确,生成的数据流在数学上将无法与随机噪声区分开来。

    白噪声数据确实是随机的,因此不可压缩

    因此,您应该找到生成它的算法(或近似值)

    在Linux中尝试以下操作:

    # dd if=/dev/urandom bs=1024 count=10000 2>/dev/null | bzip2 -9 -c -v > /dev/null
    (stdin): 0.996:1, 8.035 bits/byte, -0.44% saved, 10240000 in, 10285383 out.
    

    您可以尝试任何类型的随机数生成…

    其他答案指出随机噪声是不可压缩的,好的加密函数的输出尽可能接近随机噪声(除非您知道解密密钥)。所以一个很好的方法就是使用随机数生成器或加密算法来生成不可压缩的数据

    真正不可压缩(通过任何压缩算法)的比特串是存在的(对于“不可压缩”的某些形式定义),但即使识别它们在计算上也是不可确定的,更不用说生成它们了

    值得指出的是,“随机数据”只是不可压缩的,因为没有任何压缩算法可以在所有可能的随机数据上平均达到优于1:1的压缩比。然而,对于任何特定的随机生成的字符串,可能存在一种特定的压缩算法,该算法确实可以实现良好的压缩比。毕竟,任何可压缩字符串都应该是随机生成器的可能输出,包括像全零这样的愚蠢的东西,尽管不太可能

    因此,虽然从随机数生成器或加密算法中获取“可压缩”数据的可能性可能非常小,但我想在使用之前对数据进行实际测试。如果您有权访问VPN连接中使用的压缩算法,则最好使用该算法;只需随机生成数据,直到得到无法压缩的数据。否则,只需通过一些常用的压缩工具运行它,并检查大小是否没有减少,就足够了。

    下面的程序(C/POSIX)快速生成不可压缩的数据,它应该在每秒千兆字节的范围内。我敢肯定,可以使用总体思路使其更快(可能使用Djb的ChaCha core和SIMD?)

    /*公共领域,2013年*/
    #包括
    #包括
    #包括
    #包括
    #定义R(a,b)((a)>(32-(b)))
    静态void salsa_扰码器(uint32_t out[16],uint32_t x[16])
    {
    int i;
    /*这是一个快速残缺的Salsa20,只有一轮*/
    x[4]^=R(x[0]+x[12],7);
    x[8]^=R(x[4]+x[0],9);
    x[12]^=R(x[8]+x[4],13);
    x[0]^=R(x[12]+x[8],18);
    x[9]^=R(x[5]+x[1],7);
    x[13]^=R(x[9]+x[5],9);
    x[1]^=R(x[13]+x[9],13);
    x[5]^=R(x[1]+x[13],18);
    x[14]^=R(x[10]+x[6],7);
    x[2]^=R(x[14]+x[10],9);
    x[6]^=R(x[2]+x[14],13);
    x[10]^=R(x[6]+x[2],18);
    x[3]^=R(x[15]+x[11],7);
    x[7]^=R(x[3]+x[15],9);
    x[11]^=R(x[7]+x[3],13);
    x[15]^=R(x[11]+x[7],18);
    对于(i=0;i<16;++i)
    out[i]=x[i];
    }
    #定义块2048
    内部主(空)
    {
    uint32_t bufA[块];
    uint32_t bufB[块];
    uint32_t*输入=bufA,*输出=bufB;
    int i;
    /*初始化种子*/
    srand(时间(空));
    对于(i=0;i
    我刚刚创建了一个(非常简单且未优化)C#控制台应用程序,它可以创建不可压缩的文件。 它扫描文件夹中的文本文件(扩展名.txt),并为每个文本文件创建一个具有相同名称和大小的二进制文件(扩展名.bin)。 希望这对别人有帮助。 以下是C#代码:

    使用系统;
    使用System.Collections.Generic;
    使用System.IO;
    使用System.Linq;
    使用系统文本;
    使用System.Threading.Tasks;
    命名空间控制台应用程序1
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    var files=Directory.EnumerateFiles(@“d:\MyPath\To\TextFile\”,“*.txt”);
    var random=新的random();
    foreach(文件中的var文件名)
    {
    var fileInfo=新文件信息(文件名);
    var newFileName=Path.GetDirectoryName(文件名)+@“\”+Path.GetFileNameWithoutExtension(文件名)+“.bin”;
    使用(var f=File.Create(newFileName))
    {
    长字节写入=0;
    while(byteswrited/* public domain, 2013 */
    
    #include <stdint.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
    
    #define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
    static void salsa_scrambler(uint32_t out[16], uint32_t x[16])
    {
        int i;
        /* This is a quickly mutilated Salsa20 of only 1 round */
        x[ 4] ^= R(x[ 0] + x[12],  7);
        x[ 8] ^= R(x[ 4] + x[ 0],  9);
        x[12] ^= R(x[ 8] + x[ 4], 13);
        x[ 0] ^= R(x[12] + x[ 8], 18);
        x[ 9] ^= R(x[ 5] + x[ 1],  7);
        x[13] ^= R(x[ 9] + x[ 5],  9);
        x[ 1] ^= R(x[13] + x[ 9], 13);
        x[ 5] ^= R(x[ 1] + x[13], 18);
        x[14] ^= R(x[10] + x[ 6],  7);
        x[ 2] ^= R(x[14] + x[10],  9);
        x[ 6] ^= R(x[ 2] + x[14], 13);
        x[10] ^= R(x[ 6] + x[ 2], 18);
        x[ 3] ^= R(x[15] + x[11],  7);
        x[ 7] ^= R(x[ 3] + x[15],  9);
        x[11] ^= R(x[ 7] + x[ 3], 13);
        x[15] ^= R(x[11] + x[ 7], 18);
        for (i = 0; i < 16; ++i)
            out[i] = x[i];
    }
    
    #define CHUNK 2048
    
    int main(void)
    {
        uint32_t bufA[CHUNK];
        uint32_t bufB[CHUNK];
        uint32_t *input = bufA, *output = bufB;
        int i;
    
        /* Initialize seed */
        srand(time(NULL));
        for (i = 0; i < CHUNK; i++)
            input[i] = rand();
    
        while (1) {
            for (i = 0; i < CHUNK/16; i++) {
                salsa_scrambler(output + 16*i, input + 16*i);
            }
            write(1, output, sizeof(bufA));
    
            {
                uint32_t *tmp = output;
                output = input;
                input = tmp;
            }
        }
        return 0;
    }
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var files = Directory.EnumerateFiles(@"d:\MyPath\To\TextFile\", "*.txt");
                var random = new Random();
                foreach (var fileName in files)
                {
                    var fileInfo = new FileInfo(fileName);
                    var newFileName = Path.GetDirectoryName(fileName) + @"\" + Path.GetFileNameWithoutExtension(fileName) + ".bin";
                    using (var f = File.Create(newFileName))
                    {
                        long bytesWritten = 0;
                        while (bytesWritten < fileInfo.Length)
                        {
                            f.WriteByte((byte)random.Next());
                            bytesWritten++;
                        }
                        f.Close();
                    }
                }
            }
        }
    }