Si los datos que está transportando son principalmente de naturaleza textual, comprima primero . Si los datos son aleatorios (p. Ej., Imágenes), simplemente no comprima. No hay ninguna situación en la que deba comprimir después del cifrado.
Para entender por qué, primero considere que la compresión es efectivamente el proceso de encontrar patrones en sus datos y representarlos de forma abreviada. Además, tenga en cuenta que (la mayoría) las cifras producen datos aleatorios efectivos. La posibilidad de encontrar patrones sustanciales es bastante baja.
¿No convencido? Probemos con algunos datos. Aquí hay un guión rápido de ruby para jugar. Supongo que AES es el cifrado preferido, y zlib para la compresión:
- ¿Necesitamos conmutación CSMA / CD y LAN en la capa de enlace de datos?
- ¿Cuál es el propósito de una dirección IP?
- ¿Debe la tabla de enrutamiento contener la dirección IP o la dirección MAC de la próxima máquina? ¿Por qué?
- ¿Cómo se usan las tecnologías P2P en Skype?
- ¿A qué red corresponde el NetID en su dirección IPv4?
require 'open-uri' require 'openssl' require 'zlib' def encrypt(data) cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc') cipher.encrypt cipher.random_key cipher.random_iv result = cipher.update data result + cipher.final end def compare(data) compressed_first = encrypt(Zlib::Deflate.deflate(data)) encrypted_first = Zlib::Deflate.deflate(encrypt(data)) # compression first %, encryption first % [compressed_first.size.to_f / data.size.to_f, encrypted_first.size.to_f / data.size.to_f] end def analyze(results) c_first_sum, s_first_sum = results.reduce([0.0, 0.0]) { |m,p| [m[0] + p[0], m[1] + p[1]] } [c_first_sum / results.size, s_first_sum / results.size] end
Primero, datos textuales fácilmente comprimibles (páginas de wikipedia aleatorias):
> analyze 100.times.map { compare(open('http://en.wikipedia.org/wiki/Special:Random').read) } [0.2731796088382172, 1.0026829439942453]
En esencia, al comprimir primero, la carga útil resultante es un 27% del tamaño de la fuente original de datos textuales / web. Sin embargo, cuando se cifra primero, la carga útil es ligeramente mayor que los datos de entrada.
Tenga en cuenta que cuando va al otro extremo de datos en su mayoría aleatorios (como una imagen o datos cifrados), la compresión termina aumentando el tamaño de la salida. Esto es lo que podemos ver desde el segundo valor.