¿Cifrado de archivos que admite acceso de lectura aleatorio? [duplicar]

0

Estoy buscando un algoritmo de cifrado de archivos (o biblioteca) que admita acceso aleatorio al texto claro. Es decir, dado un archivo cifrado, necesito poder leer repetidamente rangos de bytes arbitrarios desde el texto claro con la menor sobrecarga posible.

La única cosa como esta que he encontrado es SQLCipher, pero (como su nombre lo indica) es un complemento especial para SQLite que solo admite cifrar archivos de base de datos SQLite. Necesito algo de propósito general.

Esto claramente no es ciencia de cohetes: imagino que uno lo haría dividiendo el archivo en trozos de tamaño fijo y cifrando cada trozo con un cifrado simétrico como AES. Necesitaría usar una clave diferente para cada bloque (¿derivado de la combinación de una clave maestra y el desplazamiento del bloque?), Y desearía una memoria caché de bloques LRU en memoria para el rendimiento. Pero es tan delicado que prefiero usar una biblioteca existente antes que diseñarla yo mismo y correr el riesgo de cometer un error desastroso.

Si tuviera que diseñar esto yo mismo, mi pregunta principal sería la derivación clave: ¿es seguro derivar la clave de cada bloque a partir de una clave maestra y el desfase del bloque, algo como SHA2 (masterkey || offset), o ¿Necesito generar una clave aleatoria para cada bloque? (Si es lo último, esas claves deberán almacenarse en el archivo, lo que hace que sea un poco más difícil mantener los fragmentos de archivos en los fundamentos del bloque del sistema de archivos

    
pregunta Jens Alfke 26.07.2015 - 18:46
fuente

1 respuesta

0
  

Estoy buscando un algoritmo de cifrado de archivos (o biblioteca) que admita   Acceso aleatorio eficiente al texto claro. Es decir, dado un cifrado   archivo, necesito poder leer repetidamente rangos de bytes arbitrarios desde   el texto claro con la menor sobrecarga posible.

Lo que está preguntando depende en gran medida de la primitiva de cifrado. No puede tener acceso arbitrario al texto simple sin descifrar el texto cifrado en cada acceso. Para reducir la sobrecarga, puede descifrar el archivo completo una vez, guardarlo en la memoria caché y usarlo más adelante o, según el esquema de cifrado, almacenar la cantidad mínima necesaria de parámetros necesarios para descifrar la información necesaria. Por ejemplo, los cifrados de bloques (seguros) encadenan todos los bloques anteriores antes del cifrado del actual. Por lo tanto, es suficiente conocer la salida de la anterior (y la clave) para descifrar el bloque actual. Al conocer la longitud del bloque, el vector de inicialización (si se usa) y la clave de descifrado, puede almacenar las salidas de cada bloque. Desafortunadamente, en el caso de AES, esto no reduce los requisitos de almacenamiento (ya que almacenará los datos con la longitud del texto completo en su totalidad). Sin embargo, dependiendo de los segmentos del archivo que se está utilizando, puede estimar una probabilidad de uso y almacenar en caché el texto sin formato solo para esas entradas. En la práctica, es difícil de implementar debido a las (muy) posibles compensaciones de texto simple y bloques útiles.

  

Esto claramente no es ciencia espacial: imagino que uno lo haría por   rompiendo el archivo en trozos de tamaño fijo y cifrando cada trozo   Con un cifrado simétrico como AES. Necesitaría usar una clave diferente para   cada bloque (derivado de la combinación de una clave maestra y el desplazamiento del bloque?),   y me gustaría una memoria caché de bloques LRU en memoria para el rendimiento. Pero es   tan delicado que preferiría usar una biblioteca existente antes que diseñar   yo mismo y correr el riesgo de equivocarme desastrosamente.

Una solución improvisada se vería así:

makeshift_crypto.sh

#!/bin/bash
d1="enc/"
d2="dec/"
# Split the file into separate files of 1000 bytes each, suffixed by _bigFile
split -b 1000 bigFile.tar.gz --additional-suffix=_bigFile
# Encrypt each file using aes256 cbc(with salt)
for fl in *_bigFile; do $ openssl enc -aes-256-cbc -salt -in "$fl" -out "$enc""$fl"; done
# Decrypt each file
for fl in 'ls "$enc"'; do openssl enc -aes-256-cbc -d -in "$enc""$fl" -out "$dec""$fl" 
  

Si tuviera que diseñar esto yo mismo, mi pregunta principal sería la clave   derivación: es seguro derivar la clave de cada bloque de una clave maestra   y el offset del bloque, algo como SHA2 (masterkey || offset), o   ¿Necesito generar una clave aleatoria para cada bloque? (Si este último,   esas claves deberán ser almacenadas en el archivo, lo que lo hace un poco   Es más difícil mantener los fragmentos de archivos en los fundamentos del bloque del sistema de archivos

No, no es seguro, ya que obtener la clave del bloque i (i es un índice de ese bloque) permitiría recuperar todas las claves restantes n - i donde n es el número de teclas (bloques) y 0 < = i < n . La complejidad de la gestión de claves también aumenta con el número de bloques. Es seguro usar una sola clave para todos ellos (como lo haría si cifrara / desencripta el archivo por completo).

    
respondido por el Sebi 26.07.2015 - 19:36
fuente

Lea otras preguntas en las etiquetas