Básicamente, estoy diseñando un protocolo que requiere una transmisión de archivos síncrona y ordenada desde un servidor (implementado en Node.js) a un dispositivo, a través de TCP . La transmisión del archivo no es una opción, por lo que cada fragmento de archivo se encapsula en un mensaje que tiene otros campos no cifrados, que están fuera del alcance de esta pregunta.
Uno de los requisitos es que el contenido del archivo no se puede enviar en texto sin formato, por lo que se tuvo que elegir un esquema de cifrado, en este caso opté por el AES-256-CBC , supongo a los efectos de esta pregunta, el algoritmo no se puede cambiar.
Debido a las restricciones del dispositivo (RAM ~ 10KB), se requiere dividir el archivo ( < 5 MB ) en trozos, que luego se enviarán al dispositivo de acuerdo con el protocolo mencionado, siguiendo un esquema enviar / [ack | repetir] . En la recepción, el dispositivo puede almacenar el fragmento en el disco.
Así que mi pregunta principal aquí es que en el backend tengo que elegir entre:
-
Encripta el archivo completo y luego divídelo en partes
- > El dispositivo de recepción anexaría cada fragmento en un archivo y luego lo descifraría cuando se recibieran todos los fragmentos.
vs
-
Dividiendo el archivo en trozos y luego cifre cada uno de ellos.
- > Requiere el envío del Vector de inicialización (IV) utilizado en cada cifrado de fragmentos para descifrarlo.
- > En la recepción de fragmentos, el dispositivo tendría que descifrar el fragmento o almacenar cada uno de ellos con el IV respectivo y luego descifrarlos después de recibir el último fragmento.
El objetivo aquí es comprender qué problemas de seguridad surgen de cada enfoque y también una comparación general entre ellos.
PS: También tengo un esquema de validación de integridad, pero está fuera del ámbito de la pregunta.