Comprimir y luego cifrar, o viceversa?

88

Estoy escribiendo un sistema VPN que encripta (AES256) su tráfico a través de la red (¿Por qué escribir el mío cuando ya hay 1,000,001 más? Bueno, el mío es especial para una tarea específica que ninguno de los otros encaja).

Básicamente quiero pasar mi pensamiento más allá de ti para asegurarme de que estoy haciendo esto en el orden correcto.

Por el momento, los paquetes están encriptados antes de ser enviados, pero quiero agregarles algún nivel de compresión para optimizar un poco la transferencia de datos. No es una compresión fuerte: no quiero maximizar la CPU todo el tiempo, pero quiero asegurarme de que la compresión sea lo más eficiente posible.

Entonces, mi opinión es, ¿debería comprimir los paquetes antes de cifrarlos, ya que un paquete no cifrado se comprimirá mejor que uno cifrado? ¿O al revés?

Probablemente usaré zlib para la compresión.

Lea más en el blog Super User .

Majenko
fuente
44
¿Escribir como "programación"? Sería más adecuado para Stack Overflow entonces.
Suma
44
Si estuviera preguntando sobre la programación, sí, pero no lo estoy. Esta es una pregunta general de compresión, luego encriptación o encriptación y luego compresión que podría aplicarse a trabajar con archivos simples si lo desea. El lado de la programación es solo el contexto de por qué estoy haciendo la pregunta.
Majenko
Probablemente una pregunta mejor pensada para security.stackexchange.com
Jeff Ferland
1
Ellos saben de compresión allí, ¿verdad?
Majenko

Respuestas:

176

Si el cifrado se realiza correctamente , el resultado son datos básicamente aleatorios. La mayoría de los esquemas de compresión funcionan mediante la búsqueda de patrones en sus datos que de alguna manera pueden ser eliminados, y gracias al cifrado ahora no hay ninguno; Los datos son completamente incompresibles.

Comprima antes de encriptar.

Señor alfa
fuente
41
Más importante: la compresión agrega entropía. Agregar entropía es bueno para su encriptación (más difícil de romper con ataques conocidos de texto sin formato).
Olli
8
Además, el cifrado cuesta recursos, cifrar un archivo más pequeño requerirá menos recursos. Así que comprime antes de encriptar.
GAThrawn
99
@Olli: no necesariamente si el esquema de compresión agrega texto conocido. En el peor de los casos, imagine si coloca un encabezado de 512 bytes conocido en el frente de los datos y está utilizando un cifrado en modo de bloque.
Martin Beckett
26
No estoy seguro de por qué el comentario de @ Olli sería votado, ya que es incorrecto; no solo es significativamente menos importante, para cualquier cifrado medio decente no debería ser importante en absoluto . Es decir, la fuerza del cifrado no debe estar relacionada con la entropía del mensaje.
BlueRaja - Danny Pflughoeft
8
Si comprime en absoluto, solo se puede hacer antes de cifrar el mensaje, pero tenga en cuenta que esto puede filtrar información sobre la 'compresibilidad' del mensaje original, por lo que querrá considerar si hay alguna consecuencia a este lado canal. Considere un archivo de tamaño fijo que sea todos ceros o un mensaje. El archivo all 0 dará como resultado una carga útil más pequeña bajo cualquier esquema de compresión razonable. Sin embargo, no es probable que sea un problema en este caso de uso en particular.
Edward KMETT
22

Comprimir antes del cifrado. Los datos comprimidos pueden variar considerablemente para pequeños cambios en los datos de origen, por lo que es muy difícil realizar un criptoanálisis diferencial.

Además, como señala Mr.Alpha, si encripta primero, el resultado es muy difícil de comprimir.

Juancho
fuente
12
Bueno, esto es correcto, pero fue publicado 2 horas antes de que publicaras ... Entropía
Konerak
3

Incluso si depende del caso de uso específico, recomendaría Encrypt-then-Compress. De lo contrario, un atacante podría filtrar información del número de bloques cifrados.

Asumimos que un usuario envía un mensaje al servidor y un atacante con la posibilidad de agregar texto al mensaje del usuario antes de enviarlo (por ejemplo, mediante JavaScript). El usuario quiere enviar algunos datos sensibles al servidor y el atacante quiere obtener estos datos. Entonces puede intentar agregar diferentes mensajes a los datos que el usuario envía al servidor. Luego, el usuario comprime su mensaje y el texto adjunto del atacante. Asumimos una compresión DEFLATE LZ77, por lo que la función reemplaza la misma información con un puntero a la primera aparición. Entonces, si el atacante puede reproducir el texto sin formato del agujero, la función de compresión reduce el tamaño del texto plano al tamaño original y un puntero. Y después del cifrado, el atacante puede contar el número de bloques de cifrado, para que pueda ver si sus datos agregados eran los mismos que los datos que el usuario envió al servidor. Incluso si este caso suena un poco construido, es un problema de seguridad grave en TLS. Esta idea es utilizada por un ataque llamado CRIME para filtrar cookies en una conexión TLS para robar sesiones.

fuente: http://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf

Tobias Braun
fuente
2

Mi opinión es que cuando comprimes un mensaje lo proyectas a una dimensión inferior y, por lo tanto, hay menos bits, lo que significa que el mensaje comprimido (suponiendo una compresión sin pérdidas) tiene la misma información en menos bits (¡los que eliminaste eran redundantes! ) Por lo tanto, tiene más información por bit y, en consecuencia, más entropía por bit, pero la misma entropía total que tenía antes cuando el mensaje no estaba comprimido. Ahora, la aleatoriedad es otra cuestión y ahí es donde los patrones de compresión pueden arrojar una llave inglesa.

Profe
fuente
1

La compresión debe hacerse antes del cifrado. un usuario no quiere pasar tiempo esperando la transferencia de datos, pero necesita que se haga de inmediato sin perder tiempo.

sqlchild
fuente
1

Compresión antes del cifrado como se ha señalado anteriormente. La compresión busca la estructura que puede comprimir. El cifrado codifica los datos para evitar que se detecte la estructura. Al comprimir primero, es mucho más probable que tenga un archivo más pequeño y, por lo tanto, menos carga útil para transferir. El cifrado hará su trabajo independientemente de si está comprimido o no y, nuevamente, como se señaló anteriormente, es probable que sea más difícil realizar un criptoanálisis diferencial en un archivo comprimido.

Siempre aprendiendo
fuente
Esto parece ser una repetición de las respuestas aceptadas y segundas. Cada respuesta debe aportar una solución sustancialmente nueva a la pregunta.
fijador1234
0

La compresión reduce la entropía de la información. La compresión máxima hace que la entropía sea mínima. Para datos perfectamente encriptados (ruido), la entropía máxima y mínima es la misma.

AbiusX
fuente
2
Espera, ¿no tienes eso al revés? Pensé que la entropía aumentaba a medida que disminuía la redundancia. Por lo tanto, la compresión debería aumentar la entropía.
Zan Lynx
Nop, menos entropía = más patrones. La aleatoriedad tiene más entropía.
AbiusX
1
Pero es entropía de información, por lo que se trata de significado. La aleatoriedad no significa nada, por lo que no se aplica. Una oración en inglés puede tener letras cambiadas y aún significar lo mismo, por lo que tiene baja entropía. Una oración en inglés comprimido podría ser ilegible si cambia un solo bit, por lo que tiene más. O eso creo.
Zan Lynx
La entropía no se trata de sentido y capacidad de leer o comprender, se trata de patrones. Los archivos comprimidos están llenos de patrones.
AbiusX
1
@AbiusX: Correcto. Patrones. Y cuantos menos patrones, más entropía. Lo que significa que la compresión que reemplaza todos los patrones repetidos con una sola copia aumenta la entropía.
Zan Lynx