Encriptando un archivo codificado Huffman

1

Escribí un programa de codificación Huffman que puede comprimir y descomprimir archivos. El archivo contiene un encabezado que contiene información que me permite recuperar el árbol huffman.
Quería agregar una función simple de cifrado / descifrado a mi programa. Me preguntaba qué camino es mejor:
1. Encripta el archivo completo. El problema con eso es que la gente puede descifrar mi encabezado bastante rápido (en relación con la segunda forma), ya que es un máximo de aproximadamente 1 KB. 2. Encripta todo menos el encabezado. De esa manera, el atacante tiene el árbol huffman, pero es inútil a menos que pueda encontrar la clave correcta para descifrar el contenido. Y cómo lo hará, no puede simplemente ver si se trata de texto simple o binario (simplificado), tiene que descomprimirlo con el árbol huffman, lo que requerirá más tiempo.

Creo que la segunda forma es mejor.
¿Hay algo que me estoy perdiendo aquí?
(Por favor, no me digas que use un algoritmo moderno o algo así, este es un proyecto de hobby y quiero codificarlo yo mismo)

Gracias.

    
pregunta shoham 01.09.2014 - 21:35
fuente

3 respuestas

5

A juzgar por la pregunta y los comentarios, parafrasearé tu pregunta como:

  

Me gustaría cifrar un archivo, pero parte de mi archivo tiene un formato predecible. ¿Esto hará que sea más fácil descifrar el cifrado? ¿Debo dejar las partes estructuradas y cifrar solo el mínimo?

Primero que nada: esa no es una pregunta tonta. Intuitivamente, usted pensaría que conocer la estructura del mensaje lo ayudaría a descifrarlo, y esto es cierto, hasta cierto punto.

Afortunadamente, este problema ha sido anticipado por la criptografía. Los algoritmos de encriptación 'modernos' tienen un alto factor de ramificación : un pequeño cambio en la entrada, un solo bit cambiado, creará una salida irreconociblemente diferente. Debido a esto, conocer la estructura de parte de su archivo no me ayudará mucho, ya que cualquier variación en el contenido conducirá a un resultado muy diferente.

Los factores de alta ramificación son esenciales para un cifrado fuerte. Aquí hay un breve ejemplo (1) de esto en acción:

> echo HELO1 | openssl aes-128-cbc -k meep -S 0
∙╞X╟ε╜i§B÷FÄ│Γat

> echo HELO2 | openssl aes-128-cbc -k meep -S 0
╩ ëhnw²╜╗ç1L▀≡☼·

(1) Sintaxis: openssl <algorithm> -k <passphrase> -S <salt>

Tenga en cuenta que HELO1 y HELO2 tienen una estructura similar, difieren solo en dos bits, pero producen una salida muy diferente. Esto lo hace de modo que, si comienzo a adivinar su clave de cifrado, no tendré idea de cuán "cerca" estoy. Básicamente, a menos que obtenga un golpe exacto y adivine su frase de contraseña, me costará mucho descifrar cualquier cosa de su archivo.

A menos que, por supuesto, me des información dejando sus encabezados expuestos. Ahora no solo conozco el tipo de archivo, sino que también tengo acceso al árbol de Huffman, que se creó a partir del mensaje codificado y, por lo tanto, contiene información sobre él. Es posible que pueda hacer una suposición educada sobre el contenido sin intentar descifrarlo.

Analogía: HTTP (S)

HTTP también es un protocolo estructurado: cada solicitud comienza con un 'método' (GET, POST, PUT ...) y termina con HTTP/1.X con X algún número. Aún más: cada línea que sigue tiene una estructura predecible, así como algunas líneas que podrían adivinarse con precisión ( Host: ). Eso suena como mucha información para mi uso.

Sin embargo, HTTPS cifra toda la conversación, porque no hacerlo me brindaría mucha más información. Diablos, con todos los encabezados, es posible que ni siquiera necesite para descifrar la carga útil: puedo chantajearte solo con los datos del encabezado.

    
respondido por el JvR 02.09.2014 - 15:37
fuente
2

Cifrar todo el archivo. De esta manera, las personas no podrán descifrar el encabezado a menos que descifren el archivo. Si deja el encabezado en claro, será más fácil para las personas averiguar qué datos se encuentran en el blob encriptado.

La primera forma es mucho mejor, ya que creará un archivo que los atacantes no tendrán idea del contenido.

    
respondido por el ThoriumBR 01.09.2014 - 21:55
fuente
1

Proceda con extrema precaución

Ha habido varios ataques sofisticados que utilizan cambios en el tamaño de los datos comprimidos para revelar el contenido. El CRIME y BREACH funcionaron porque los datos confidenciales estaban comprimidos y al enviar varias solicitudes que diferían solo de un carácter a la vez y al comparar el tamaño de las salidas, pudieron recuperar los datos. Esto siempre es un riesgo cuando cifras datos comprimidos.

    
respondido por el John Deters 02.09.2014 - 21:42
fuente

Lea otras preguntas en las etiquetas