当前位置: 首页 > 知识库问答 >
问题:

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

东郭翰音
2023-03-14

我试图解密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

键.txt包含很长的键 -

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

我做错了什么?

共有3个答案

董和风
2023-03-14

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

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

南宫保臣
2023-03-14

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

外部传真系统标头包含 DRM 元数据,而不是密钥。

这是从 Adobe 媒体服务器开发人员指南中摘录的:受 Adobe 访问服务器保护的变体播放列表还需要包含#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://faxs.adobe.comURI用于本地密钥服务。所以密钥是从设备本地获得的。

屈星腾
2023-03-14

这可能有点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.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
 类似资料:
  • 问题内容: 由于ZipFile会引发Bad Password错误,因此是否可以使用python直接解压缩AES-128加密文件。如果我使用7zip,它可以工作,因此密码是正确的,但是再次需要将7zip安装为依赖项。 我试过的 这将引发“错误密码”异常。 使用7zip检查文件 返回: 问题答案: Python标准库中的zipfile模块仅支持CRC32加密的zip文件(请参阅此处:http : //

  • 我用java编写了这段代码,以便解密密文。我有钥匙。对我来说,一切都是正确的,但我有我要解释的问题。 这是我的代码: 我收到以下错误: 出了什么问题?我知道这个问题在某种程度上与衬垫有关,但我不知道确切的解决方案。我只有一个密文IV和密钥。

  • 我正在尝试在运行FreeRTOS的微处理器上使用mbedTLS加密一些文本。我正在使用带有PKCS7填充的AES 128 CBC。如果我尝试在mbedTLS中加密,并在文本少于16个字符时在Java中解密,则可以正常工作。我可以在Java中解密它,并且文本匹配。如果它更长,那么它就不再有效。我做错了什么? mbedTLS 代码: Java代码: Java抛出javax.crypto。BadPadd

  • 问题内容: 我一直在尝试使用AES-128 CBC解密字符串,该字符串最初是使用JAVA AES加密加密的。在Java中,使用PKCS7填充。而且我尝试使用类似的PHP代码进行加密和解密。但是我得到了不同的结果。 我的Java代码 以及我正在使用的等效PHP代码。 在Java中 纯文本= 123456 密码文本= tpyxISJ83dqEs3uw8bN / + w =​​= 在PHP中 纯文本=

  • 我一直在尝试使用AES-128 CBC解密一个字符串,它最初是使用JAVA AES加密加密的。在java中,使用了PKCS7填充。我试着用类似的PHP代码进行加密和解密。但我得到了不同的结果。 我的Java代码 以及我正在使用的等效PHP代码。 在Java 纯文本=123456 密码文本=tpyxISJ83dqEs3uw8bN/w== 在PHP中 纯文本=123456 密码文本=ierqftckt

  • 我正在尝试解密AES加密数据(在. NET中加密),但我的解密结果字符串似乎不可读,并且我没有收到任何错误。 数据加密使用: < li>Padding: PKCS7Padding < li>KeySize: 128 < li >模式:CBC, 我有InItVector、PassCode、salt和NumberOfPassword(3)次迭代。 这是我的代码: 下面是在 .NET 端加密数据的代码: