我正在编写一个 VPN 系统,它可以对网络上的流量进行加密(AES256)(既然已经有 1,000,001 个其他的系统了,为什么还要编写我自己的呢?好吧,我的系统是针对特定任务而开发的,其他系统都不适合)。
基本上,我想向您解释我的想法,以确保我按照正确的顺序进行操作。
目前,数据包在发送之前只是加密的,但我想给它们添加一定程度的压缩,以稍微优化数据传输。不是重度压缩 - 我不想一直让 CPU 达到最大限度,但我想确保压缩尽可能高效。
因此,我的想法是,我应该压缩数据包前加密未加密的数据包压缩效果会比加密的数据包好吗?或者反过来呢?
我可能会使用 zlib 进行压缩。
阅读更多在超级用户博客上。
答案1
如果加密正确完成那么结果基本上就是随机数据。大多数压缩方案都是通过寻找数据中可以以某种方式分解出来的模式来工作的,而由于加密,现在没有任何模式了;数据完全不可压缩。
加密前先压缩。
答案2
加密前先压缩。压缩数据会因为源数据的微小变化而产生很大差异,因此很难进行差分密码分析。
而且,正如 Mr.Alpha 指出的那样,如果您先加密,结果将很难压缩。
答案3
即使这取决于具体用例,我还是建议先加密再压缩。否则攻击者可能会泄露加密块数量的信息。
我们假设用户向服务器发送消息,而攻击者可以在发送之前将文本附加到用户消息中(例如通过 javascript)。用户想要向服务器发送一些敏感数据,而攻击者想要获取这些数据。因此,他可以尝试将不同的消息附加到用户发送到服务器的数据中。然后,用户压缩他的消息和攻击者附加的文本。我们假设使用 DEFLATE LZ77 压缩,因此该函数将相同的信息替换为指向首次出现的指针。因此,如果攻击者可以重现漏洞明文,则压缩函数会将明文的大小减小到原始大小和一个指针。加密后,攻击者可以计算密码块的数量,这样他就可以查看他附加的数据是否与用户发送到服务器的数据相同。即使这种情况听起来有点虚构,但它是 TLS 中的一个严重安全问题。一种名为 CRIME 的攻击利用了这个想法,在 TLS 连接中泄露 cookie 以窃取会话。
来源:http://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf
答案4
压缩应该在加密之前完成。用户不想花时间等待数据传输,但他/她需要立即完成而不浪费任何时间。