2013-04-21 4 views
4

Я пытаюсь расшифровать AES-128 зашифрованные m3u8 видео файлы, такие как этот:Как расшифровать AES-128 зашифрованные видеофайлы m3u8?

файл m3u8:

#EXTM3U 
#EXT-X-MEDIA-SEQUENCE:0 
#EXT-X-ALLOW-CACHE:NO 
#EXT-X-VERSION:2 
#EXT-X-FAXS-CM:MII6lAYJKoZIhvcNAQcCoII6hTCCOoECAQExCzAJBgUrDgMCGgUAM... very long key... 
#EXT-X-KEY:METHOD=AES-128,URI="faxs://faxs.adobe.com",IV=0X99b74007b6254e4bd1c6e03631cad15b 
#EXT-X-TARGETDURATION:8 
#EXTINF:8, 
video.mp4Frag1Num0.ts 
#EXTINF:8, 
video.mp4Frag1Num1.ts 
... 

Я попытался с помощью OpenSSL:

openssl aes-128-cbc -d -kfile key.txt -iv 99b74007b6254e4bd1c6e03631cad15b -nosalt -in video_enc.ts -out video_dec.ts 

KEY.TXT содержит очень длинный ключ ->

bad decrypt 
1074529488:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539: 

Что я делаю неправильно?

ответ

3

Для расшифровки зашифрованного видеопотока необходим ключ шифрования. Этот ключ не часть потока. Он должен быть получен отдельно.

EXT-X-FAXS-CM заголовок содержит метаданные DRM, а не ключ.

Это руководство разработчика Adobe Media Server: . В списке воспроизведения, поддерживаемом Adobe Access Server, также необходимо включить тег # EXT-X-FAXS-CM. Значение тега # EXT-X-FAXS-CM в альтернативном списке воспроизведения является относительным URI, относящимся к метаданным DRM одного из отдельных потоков. В качестве клиента тег # EXT-X-FAXS-CM в альтернативном плейлисте будет используемый для создания сеанса DRM. Тот же сеанс DRM будет использоваться для всех зашифрованных файлов M3U8 внутри списка воспроизведения.

Полное руководство можно найти здесь: http://help.adobe.com/en_US/adobemediaserver/devguide/WS5262178513756206-4b6aabd1378392bb59-7fe8.html

Существует также отметить, что faxs: //faxs.adobe.com URI для локального ключа сервировки. Так ключ, полученный локально с устройства.

+0

Кажется, это сложнее, чем я думал, спасибо за ваше объяснение , Теперь я попытаюсь найти ключ. – dabiboo

0

Даже через этот файл включены зашифрованные данные AES, openssl не знают формат m3u8. Однако FFmpeg может справиться с этим.

+0

ffmpeg не может обрабатывать этот вид m3u8.Я думаю, что могу прочитать его и найти полезный ввод для openssl, символы, следующие за «# EXT-X-FAXS-CM:», - это кодированный файл base64 p7b. Как только я base64 расшифровал его и сохранил в файл .p7b, я могу открыть его с помощью программы просмотра Ms Windows. Я знаю, что нужно знать, что нужно открывать ключ от этого файла p7b. – dabiboo

+0

Чтобы иметь возможность печатать на компьютере, отличном от Windows, просто преобразуйте его в CER (см. Этот ответ http://stackoverflow.com/a/22259331/3514658) – wget

1

Это может быть немного рубить, но дал URL к файлу .m3u8, она будет скачать и расшифровать файлы, составляющие поток:

#!/usr/bin/env bash 
curl "$1" -s | awk 'BEGIN {c=0} $0 ~ "EXT-X-KEY" {urlpos=index($0,"URI=")+5; ivpos=index($0,"IV="); keyurl=substr($0, urlpos, ivpos-urlpos-2); iv=substr($0, ivpos+5); print "key=`curl -s '\''"keyurl"'\'' | hexdump -C | head -1 | sed \"s/00000000//;s/|.*//;s/ //g\"`"; print "iv="iv} $0 !~ "-KEY" && $0 ~ "http" {printf("curl -s '\''"$0"'\'' | openssl aes-128-cbc -K $key -iv $iv -d >seg%05i.ts\n", c++)}' | bash 

Этого скрипт генерирует второй сценарий, извлекает ключи и векторы инициализации и использует их для дешифрования при загрузке. Для этого нужны завитки, awk, hexdump, sed и openssl. Вероятно, он задохнется в незашифрованном потоке или потоке, который использует что-то другое, кроме AES-128 (поддерживается ли любое другое шифрование?).

Вы получите кучу файлов: seg00000.ts, seg00001.ts и т. Д. Используйте tsMuxeR (https://www.videohelp.com/software/tsMuxeR), чтобы объединить их в один файл (простая конкатенация не сработала для меня ... это то, что я попробовал первый):

(echo "MUXOPT --no-pcr-on-video-pid --new-audio-pes --vbr --vbv-len=500"; (echo -n "V_MPEG4/ISO/AVC, "; for i in seg*.ts; do echo -n "\"$i\"+"; done; echo ", fps=30, insertSEI, contSPS, track=258") | sed "s/+,/,/"; (echo -n "A_AAC, "; for i in seg*.ts; do echo -n "\"$i\"+"; done; echo ", track=257") | sed "s/+,/,/") >video.meta 
tsMuxeR video.meta video.ts 

(идентификаторы трека и фреймрейт может потребоваться корректировка ... получить значения для использования при прохождении одного из загруженных файлов tsMuxeR)

Затем с помощью FFmpeg ремультиплексирования к чему-то. бит более широко понимается:

ffmpeg -i video.ts -vcodec copy -acodec copy video.m4v 
+0

Мне пришлось изменить ваш скрипт, потому что URL-адреса в моем случае содержали символы% от кодировки URI. Это то, что сработало для меня: '' 'curl '$ 1" -s | awk 'BEGIN {c = 0} $ 0 ~ "EXT-X-KEY" {urlpos = index ($ 0, "URI =") + 5; ivpos = индекс ($ 0, IV "="); keyurl = substr ($ 0, urlpos, ivpos-urlpos-2); iv = substr ($ 0, ivpos + 5); print "key =' curl -s '\' '"keyurl"' \ '' | hexdump -C | head -1 | sed \ "s/00000000 //; s/|. * //; s/// g \ "'"; print "iv =" iv} $ 0! ~ "-KEY" && $ 0 ~ "http" {printf ("curl -s '\' '% s' \ '' | openssl aes-128-cbc -K $ key -iv $ iv -d> seg% 05i.ts \ n ", $ 0, C++)} '| bash '' ' –

Смежные вопросы