У меня есть зашифрованный видеофайл на удаленном сервере, который я пытаюсь расшифровать на лету с помощью nodejs и передать пользователю через express.
Он работает .. но не работает 206 частичный контент (когда пользователь ищет видео).
Вот мой фрагмент:
app.get('/stream/:id', async (req, res) => {
var decryptStream = crypto.createDecipheriv('aes-256-cbc', my_key, Buffer.from('(my buffer)', 'hex'))
var positions, start, end, total, chunksize;
if ((req.headers.range)) {
request({
url: 'https://remote/encrypted_file.mp4',
method: 'HEAD'
}, function (error, response) {
var range = req.headers.range
positions = range.replace(/bytes=/, "").split("-");
start = parseInt(positions[0], 10);
total = response.headers['content-length'];
end = positions[1] ? parseInt(positions[1], 10) : total - 1;
chunksize = (end - start) + 1;
res.writeHead(206, {
"Content-Range": "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": "video/mp4"
});
var data = request({
url: 'https://remote/encrypted_file.mp4',
headers: {
range: "bytes=" + start + "-" + end,
connection: 'keep-alive'
}
})
console.log(`[${start} - ${end} => ${end - start}`)
data.pipe(decryptStream).pipe(res);
});
}
})
Консоль:
[0 - 134252239 => 134252239] <--- So it works fine when file starts from beginning (0 offset) (video plays in browser)
... now user seeks...
[134217728 - 134252239 => 34511] <--- fails!! :(
internal/streams/legacy.js:61
throw er; // Unhandled stream error in pipe.
^
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipheriv._flush (internal/crypto/cipher.js:141:29)
at Decipheriv.prefinish (_stream_transform.js:142:10)
at Decipheriv.emit (events.js:315:20)
at prefinish (_stream_writable.js:619:14)
at finishMaybe (_stream_writable.js:627:5)
at Decipheriv.Writable.end (_stream_writable.js:571:5)
at Request.onend (internal/streams/legacy.js:46:10)
at Request.emit (events.js:327:22)
at IncomingMessage.<anonymous> (C:\Users\ashesh\Desktop\Accgen\drive-file-browser\node_modules\request\request.js:1076:12)
at Object.onceWrapper (events.js:421:28) {
library: 'digital envelope routines',
function: 'EVP_DecryptFinal_ex',
reason: 'wrong final block length',
code: 'ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH'
}
Похоже, я не могу расшифровать конкретный c часть файла? Я не уверен.
Я просто хочу, чтобы пользователи могли искать это видео, которое я расшифровываю на лету и передаю им.
Спасибо за любую помощь.
PS: я сам зашифровал файлы, ключ и iv верны.
Спасибо за ваше время и помощь :)
введите описание изображения здесь
Как видите, 206 завершается успешно, если диапазон начинается с 0 (начало файла), но терпит неудачу, если диапазон начинается не с начала файла ..