如何解密 AES-128 加密的 m3u8 视频文件?
Posted
技术标签:
【中文标题】如何解密 AES-128 加密的 m3u8 视频文件?【英文标题】:How to decrypt AES-128 encrypted m3u8 video files? 【发布时间】:2013-04-14 11:14:17 【问题描述】:我试图解密 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:
我做错了什么?
【问题讨论】:
【参考方案1】:在许多情况下,VLC 很乐意将 .m3u8 视频转换为未加密的 .ts 或 .mp4。在 VLC 图形界面中,转到媒体 > 转换/保存。
【讨论】:
【参考方案2】:虽然现有答案中的一些 bash 脚本可以让您部分(甚至全部)完成,但取决于您尝试从哪个站点下载,您可能会遇到其他障碍(不同的身份验证方法、自定义许可证服务器挂载等)
我发现streamlink 是最强大的解决方案,它还可以让您直接流式传输(而不是下载),如果这是您所追求的,并且它已经完成了所有特定于站点的工作为您提供一长串站点(请参阅plugins section,但请记住,它正在积极开发中,最新版本是在 6 月,因此对于一些较新的站点,您必须git clone
并从源代码安装) .
【讨论】:
【参考方案3】:这可能有点小技巧,但是给定一个 .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
【讨论】:
我不得不修改你的脚本,因为在我的例子中,URL 包含来自 URI 编码的 % 符号。这对我有用: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 '\''%s'\'' | openssl aes-128-cbc -K $key -iv $iv -d >seg%05i.ts\n", $0, c++)' | bash
这个站点:support.jwplayer.com/customer/portal/articles/1430261 有一个加密的 m3u8 url:playertest.longtailvideo.com/adaptive/oceans_aes/… 我将脚本复制到一个文本文件中并将其命名为 script.sh,然后在终端中运行 bash script.sh '@987654324 @' 但什么也没发生,我做错了吗?
@John,与此 m3u8 文件描述符的区别在于: 1. 加密不使用初始化向量,因此此脚本在搜索“IV=”字符串时失败。 2. m3u8 文件中的 URL 是相对的,再次导致脚本失败。对于这种特殊情况,脚本需要修改。
试试这个:BASE=https://playertest.longtailvideo.com/adaptive/oceans_aes/; M3U8=oceans_aes-audio=65000-video=2042000.m3u8; curl "$BASE$M3U8" -s | awk "BEGIN c=0 \$0 ~ \"EXT-X-KEY\" urlpos=index(\$0,\"URI=\")+5; keyurl=substr(\$0, urlpos, length(\$0)-urlpos); print \"key=`curl \\\"$BASE\"keyurl\"\\\" -s | hexdump -C | head -1 | sed \\\"s/00000000//;s/|.*//;s/ //g\\\"`\" \$0 !~ \"^#\" printf(\"curl \\\"$BASE%s\\\" -s | openssl aes-128-cbc -K \$key -iv 00000000000000000000000000000000 -d >seg%05i.ts\\n\", \$0, c++)" | bash
感谢回复,上周我可以通过 hlsdl 下载视频,github.com/selsta/hlsdl【参考方案4】:
为了解密加密的视频流,您需要加密密钥。 此密钥不是流的一部分。应该单独获取。
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 用于本地密钥服务。 所以密钥是从设备本地获取的。
【讨论】:
这似乎比我想象的要难,感谢您的解释。我现在将尝试找到钥匙。【参考方案5】:即使通过此文件包含 AES 加密数据,openssl
也不知道 m3u8
格式。不过FFmpeg 或许可以处理。
【讨论】:
ffmpeg 无法处理这种 m3u8。我想我可以阅读它并找到对 openssl 有用的输入,“#EXT-X-FAXS-CM:”后面的字符是 base64 p7b 编码文件。一旦我对它进行 base64 解码并将其保存到 .p7b 文件中,我就可以使用 Ms Windows 查看器打开它。我知道需要知道 open 才能从此 p7b 文件中检索密钥。 为了能够在非 Windows 机器上正确打印,只需将其转换为 CER(参见此答案***.com/a/22259331/3514658)以上是关于如何解密 AES-128 加密的 m3u8 视频文件?的主要内容,如果未能解决你的问题,请参考以下文章
Exoplayer 播放由 AES - 128 加密的 HLS m3u8 视频