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

Encryption 如何解密AES-128加密的m3u8视频文件?,encryption,openssl,aes,m3u8,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

我正在尝试解密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包含非常长的键 -->


我做错了什么?

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

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

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

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

完整指南可在此处找到:

还有人提到faxs://faxs.adobe.com URI用于本地密钥服务。
因此,从本地设备获取的密钥。

这可能有点黑客行为,但如果提供.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、hextump、sed和openssl来运行。它可能会在未加密的流上阻塞,或者在使用AES-128以外的内容的流上阻塞(是否支持任何其他加密?)

您将得到一组文件:seg00000.ts、seg00001.ts等。使用tsMuxeR()将这些文件合并到一个文件中(简单的连接对我不起作用……这是我首先尝试的):

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

然后,使用ffmpeg重新体验更广泛理解的内容:

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

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


我发现这是最强大的解决方案,它还允许您直接流式传输(而不是下载),如果这是您想要的,并且它已经为您完成了一长串站点的所有特定站点的工作(请参阅,但请记住,它正在积极开发中,最新版本是在6月份发布的,因此对于一些较新的版本,您必须
git clone
并从源代码安装).

在许多情况下,VLC会很高兴地将.m3u8视频转换为未加密的.ts或.mp4。在VLC图形界面中,转到Media>convert/Save。

ffmpeg无法处理此类m3u8。我想我可以阅读它,并找到openssl的有用输入,即“#EXT-X-FAXS-CM”后面的字符:是base64 p7b编码文件。一旦我对其进行base64解码并将其保存到.p7b文件中,我就可以使用Ms Windows viewer打开它。我知道需要知道open才能从该p7b文件中检索密钥。要在非Windows机器上正确打印,只需将其转换为CER即可(参见此答案)这似乎比我想象的要难,谢谢你的解释。我现在将尝试找到密钥。我不得不修改你的脚本,因为我的例子中URL包含URI编码的%符号。这对我来说是有效的:
curl“$1”-s | awk“BEGIN{c=0}$0~”EXT-X-key“{urlpos=index($0,“URI=”)+5;ivpos index($0,“IV=”);keyurl=r=r($0,urlpos,ivpos-urlpos-2);iv=substr($0,ivpos+5);print“key=`curl-s'\''”keyurl'''''''''''''hextdump-C | head-1 | sed\'s/00000000//;s/`s///;s////g''''print“iv=“iv=”iv}$0!~“-key”&$0~”http{printf printf(“curl-s''''''''''s'%s'\'''''''''''''''''''''s'''''''openssl aes-128-cbc'./'K'.$iv/$seg////d'.-$s'“| bash
此站点:有一个加密的m3u8 url:我将脚本复制到一个文本文件中,并将其命名为script.sh,在终端中,我然后运行bash script.sh”“,但什么都没有发生,我做错了什么吗?@John,此m3u8文件描述符的区别在于:1.加密没有使用初始化向量,因此此脚本失败。”ile搜索“IV=”string.2。m3u8文件中的URL是相对的,再次导致脚本失败。对于这种特殊情况,脚本需要修改。请尝试以下操作:
BASE=https://playertest.longtailvideo.com/adaptive/oceans_aes/;M3U8=oceans\U aes-audio=65000 video=2042000.M3U8;curl“${BASE}${M3U8}”-s|awk“开始{c=0}\$0~\”EXT-X-KEY\“{urpospos=索引(\$0,\“URI=\”)5+5;keyurl=substr(\$0,urpos,长度(\$0-10-urpos)10+urpos=索引(\$0,\{{10.10,\'10.0,\”{{10.0,{{10.10.10)10.关键词关键词;印刷;印刷”关键关键点:印刷”关键点:卷曲\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\%05i.ts\\n\“,\$0,C++)}“| bash
感谢您的回复,我上周通过hlsdl下载了视频,
(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
ffmpeg -i video.ts -vcodec copy -acodec copy video.m4v