如何解密AES-128加密的m3u8视频文件?

时间:2013-04-21 14:19:08

标签: encryption openssl aes 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:

我做错了什么?

5 个答案:

答案 0 :(得分:4)

为了解密加密的视频流,您需要加密密钥。 此密钥是流的一部分。它应该单独获得。

EXT-X-FAXS-CM标头包含DRM元数据,而不是密钥。

这超出了Adobe Media Server开发人员指南: 受Adobe Access Server保护的变体播放列表还需要包含#EXT-X-FAXS-CM标记。变体播放列表中的#EXT-X-FAXS-CM标记的值是指代其中一个流的DRM元数据的相对URI。在客户端,变体播放列表中的#EXT-X-FAXS-CM标记将是用于创建DRM会话。相同的DRM会话将用于变体播放列表中的所有加密M3U8文件。

完整指南可在此处找到: http://help.adobe.com/en_US/adobemediaserver/devguide/WS5262178513756206-4b6aabd1378392bb59-7fe8.html

还提到传真://faxs.adobe.com URI用于本地密钥服务。 所以从设备本地获得密钥。

答案 1 :(得分:2)

这可能有点像黑客攻击,但是如果有一个.m3u8文件的URL,它将下载并解密构成该流的文件:

#!/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

此脚本生成第二个脚本,该脚本提取密钥和初始化向量,并在下载时使用它们进行解密。它需要curl,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

(跟踪ID和帧速率可能需要调整...通过将下载的文件之一传递给tsMuxeR来获取要使用的值。)

然后使用ffmpeg重新学习更广泛理解的东西:

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

答案 2 :(得分:1)

尽管现有答案中的某些bash脚本使您部分(甚至全部)采用这种方式,但取决于您要从哪个网站下载,您可能会遇到其他障碍(不同的身份验证方法,自定义许可证服务器安装等)

我发现streamlink是最可靠的解决方案,如果您要这样做的话,它也可以让您直接进行流式传输(而不是下载),并且可以完成所有特定于站点的工作已经为您完成了很多网站的准备工作(请参见plugins section,但是请记住,该网站正在积极开发中,最新版本是在6月,因此对于某些较新的网站,您必须{{1} },然后从源代码安装)。

答案 3 :(得分:0)

即使此文件包含AES加密数据,openssl也不知道m3u8格式。但是FFmpeg可能能够处理它。

答案 4 :(得分:0)

在许多情况下,VLC 会很乐意将 .m3u8 视频转换为未加密的 .ts 或 .mp4。在 VLC 图形界面中,转到媒体 > 转换/保存。