Hice esta imagen que explica lo que estoy tratando de lograr.
Breve resumen: quiero que los usuarios puedan subir un video encriptado que solo aquellos que tienen la contraseña podrán ver como una transmisión. El punto de todo esto es que el servidor no pueda descifrarlo.
Lo que logré hacer en este momento es solo la primera parte, cifrar los fragmentos y enviarlos:
fileInput.addEventListener("change", async () => { const file = fileInput.files[0] const stream = file.stream() const reader = stream.getReader() while(true) { const {value, done} = await reader.read() if(done) break handleChunk(value) } const out = { size: file.size, type: file.type, encryptedStream: encryptedStream } }) function handleChunk(chunk) { // chunk: Uint8Array const parsedChunk = CryptoJS.enc.Utf8.parse(chunk) encryptedStream.push(CryptoJS.AES.encrypt(parsedChunk, "encryptionKey").toString()) }Supongo que también puedes hacer esto con File.slice() pero no lo probé.
En este punto, siento que he investigado todas las API relacionadas con archivos/flujos tanto en Node como en Vanilla js, pero no puedo encontrar una manera de hacer que esto funcione, todo lo que he logrado es hacer un Readable de la matriz encryptedStream en el backend.
const Readable = require("stream").Readable let readable = new Readable() encryptedStream.forEach(aesChunk => readable.push(aesChunk)) readable.push(null)Tengo dudas sobre cómo transmitirlo a otra interfaz y, literalmente, no tengo idea de cómo reproducir el video después de descifrarlo. Por lo que he buscado en línea, parece que no es posible transmitir un archivo encriptado, solo para descargarlo.
Es posible hacer esto ?