首页 > Python资料 博客日记
M3U8工作原理以及key解密视频流详解
2024-09-17 03:00:06Python资料围观163次
文章目录
前言
之前随手写了一篇文章 某网课平台m3u8 key解密算法分析以及python实现
没想到有那么多的朋友关注,在这里感谢大家的支持。
最近收到不少私信都是关于m3u8解密的问题,沟通的时候发现有很多人对基本概念不是很解。这篇文章将带领大家详细了解下m3u8相关的一些基础知识,希望对大家有所帮助。
废话不多说,下面开始进入正题。
一、M3U8是什么?
有人说m3u8是一种视频格式,m3u8解密就是去解密m3u8。这种说法是错误的。
m3u8文件是指UTF-8编码格式的M3U文件,它实际上是一个包含多个URL的文本文件,每个URL指向一个音频或视频片段。这些片段可以是分段的,使得流媒体可以按需传输,从而实现自适应码率。m3u8文件通常用于流媒体传输,是HTTP Live Streaming(HLS)技术的一部分(HTTP LiveStreaming)是一种由苹果公司开发的流媒体传输协议,用于在互联网上实时传输音频和视频内容。它的主要特点是将整个视频流切分成短小的ts片段,并使用m3u8播放列表文件指示这些片段的顺序和位置。
不难看出,m3u8其实就是一个播放列表索引文件。
二、HLS—M3U8的工作原理
1.分段视频流
首先,视频流会被分成很多个小的.ts格式的片段。
2.生成播放列表
服务器或生成一个.m3u8文件,其中包含了所有的.ts片段的URL。
3.客户端请求和解析
客户端(浏览器)获取到.m3u8文件后,会解析其中的信息,包括每个.ts片段的持续时间、序列号、以及对应的URL。
4.片段下载和播放
客户端根据解析得到的信息,开始下载第一个.ts片段。通常,客户端会同时下载几个片段来提高播放的流畅性和缓冲性能。
当第一个.ts片段下载完毕后,客户端会开始播放这个片段。同时,客户端会继续下载后续的.ts片段,以确保连续的播放体验。
三、.m3u8文件内部是什么样的?
当我们使用文本编辑器打开.m3u8文件后,里面可能是这样的:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.000,
http://example.com/video/segment0.ts
#EXTINF:10.000,
http://example.com/video/segment1.ts
#EXTINF:10.000,
http://example.com/video/segment2.ts
#EXTINF:10.000,
http://example.com/video/segment999.ts
#EXT-X-ENDLIST
也可能是这样的:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/keyfile",IV=0x1234567890abcdef1234567890abcdef
#EXTINF:10.000,
http://example.com/video/segment0.ts
#EXTINF:10.000,
http://example.com/video/segment1.ts
#EXTINF:10.000,
http://example.com/video/segment2.ts
#EXTINF:10.000,
http://example.com/video/segment999.ts
#EXT-X-ENDLIST
很明显后者多了一行
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/enc.key",IV=0x1234567890abcdef1234567890abcdef
其实,它就表示这个.m3u8文件里的视频流片段被加密了。大概意思是:
使用AES-128算法加密,KEY被存放在https://example.com/enc.key里 ,IV是0x7d5f0881be55ce4a3f2b8d811de877db
四、简单介绍下AES-128算法
AES-128是一种加密算法,存在很多种模式如:ECB、CBC、CTR等。
在加密视频流里常见的就是CBC模式,这个模式的特征是使用KEY(密钥)和IV(初始化向量)去加密数据。通常KEY和IV的长度都是128比特(bit)也就是16字节(byte)。
例如:我们使用AES-128-CBC算法加密 hello csdn 这句话。首先我们需要自行设置一组key和iv。
假设:key和iv分别为
5931636472715a5a35446e5441614f50
1234567890abcdef1234567890abcdef
使用外部工具对其加密后的结果如图:
可以看到加密后的数据为79E2EF0572DF66270837A6F09C74B432
有加密就会有解密
我们也可以使用key和iv对加密后的数据进行解密
解密结果:hello csdn
与我们加密前的完全一致。
由此可见,无论是加密还是解密,数据
,key
,iv
这三个要素缺一不可。
五、拿到KEY后如何去解密?
首先我们要搞清楚解密对象是谁?
看懂了上文HLS—M3U8的工作原理,就不用我解释,接着往下看即可。
如果仍然认为所谓的m3u8解密
是对m3u8文件去解密,请回到文章开头重新阅读。
1.手动解密.ts文件
样本地址:aHR0cHM6Ly93d3cuaHVvaHV0di5uZXQv
播放任意视频,F12打开开发者工具后刷新网页,抓到m3u8请求包。
我们可以尝试下提取其中任意一条.ts的URL下载到本地进行播放。
无法正常播放并提示文件类型不受支持,或文件已损坏,其实这就是典型的被加密。我们只需要找到key和iv即可对其解密。
其实在我们抓包m3u8请求的时候,key和iv就已经出现了。
#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x00000000000000000000000000000000
这里已经明确地告诉了我们,iv是
0x00000000000000000000000000000000
key存放在当前目录下enc.key
文件里。
而这个请求,实际上已经返回了key
Y1cdrqZZ5DnTAaOP
可能会有人疑惑,这个key咋那么短呢?
实际上,这是十六进制key经过ASCII编码后得到的字符串格式的key。这种情况需要特别注意,以后会很常见。特别是key被加密时分析js文件的时候,十六进制与字符串、字节数组之间的转换知识尤为重要,后面有机会再说吧。
我们可以将enc.key
文件下载下来使用文本编辑器打开。
就得到了十六进制key
5931636472715A5A35446E5441614F50
现在我们可以对.ts
文件进行解密了,下面是解密代码:
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
def decrypt(data,key,iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
dec_data = unpad(cipher.decrypt(data), AES.block_size)
return dec_data
if __name__ == '__main__':
key = bytes.fromhex('5931636472715A5A35446E5441614F50')
iv = bytes.fromhex('00000000000000000000000000000000')
# 读取本地加密ts文件
with open('1.ts','rb') as f:
enc_ts = f.read()
# 解密ts
dec_ts = decrypt(enc_ts,key,iv)
# 将解密后的ts保存
with open('dec.ts','wb') as ff:
ff.write(dec_ts)
代码执行完毕后打开解密后的.ts文件,已经可以正常播放。
至此,视频流的其中一个片段就解密成功了。
后续可以增加代码,实现从m3u8文件读取所有的ts,进行批量解密。然后合并成一个大的ts文件,最后再转为.mp4格式。
这里就不写详细代码了,因为有更好的解决方案,请继续看下文。
2.前人栽树,后人乘凉
手动解密ts是为了让大家更好的了解加密视频流的解密逻辑。在实际应用中,大可不必这么麻烦。
我们可以使用一些成熟的m3u8下载工具进行解密下载。
如:逍遥一仙M3U8下载器、N_m3u8DL下载器等,这些下载器的功能都很完善,并且是免费使用的。
在此向这些无私奉献的前辈们致敬!
3.为什么有的key拿不到?有的能拿到但解密失败?
这种情况是非常常见的,原因可能有以下几点:
①.key被加密
②.key的获取方式被加密
③.m3u8、key具有使用次数限制
······
本文重点是带大家了解m3u8的工作原理
以及key是怎样解密视频流的
。所以这些问题就不在此叙述了,有兴趣的朋友可以翻看我上一篇文章。后续有时间也会发一些比较常见的案例以及解决方法,暂时就写到这了。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj