Расшифровка данных с удаленного сервера и передача пользователю с использованием express - PullRequest
0 голосов
/ 02 августа 2020

У меня есть зашифрованный видеофайл на удаленном сервере, который я пытаюсь расшифровать на лету с помощью 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 (начало файла), но терпит неудачу, если диапазон начинается не с начала файла ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...