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).