介绍如何解密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:

我做错了什么?

这可能有点hack,但是给定一个.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.tsn", 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

为了解密加密的视频流,您需要加密密钥。这个键是而不是流的一部分。应单独获取。

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.com://faxs.adobe.com URI用于本地密钥服务。所以从设备本地获得的键

虽然现有答案中的一些bash脚本可以让您部分(甚至全部)完成,但这取决于您尝试从哪个站点下载,您可能会遇到其他障碍(不同的验证方法、自定义许可服务器安装等)

我发现streamlink是最强大的解决方案,它也可以让你直接流(而不是下载),如果这是你想要的,它已经为你完成了一长串网站的所有特定网站的工作(见插件部分,但请记住它正在积极开发中,最新版本是在6月,所以对于一些较新的你必须git clone和从源代码安装)。

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

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

最新更新