M3U8工作原理以及key解密视频流详解

文章目录

  • 前言
  • 一、M3U8是什么?
  • 二、HLS—M3U8的工作原理
    • 1.分段视频流
    • 2.生成播放列表
    • 3.客户端请求和解析
    • 4.片段下载和播放
  • 三、.m3u8文件内部是什么样的?
  • 四、简单介绍下AES-128算法
  • 五、拿到KEY后如何去解密?
    • 1.手动解密.ts文件
    • 2.前人栽树,后人乘凉
    • 3.为什么有的key拿不到?有的能拿到但解密失败?

前言

之前随手写了一篇文章 某网课平台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

与我们加密前的完全一致。

由此可见,无论是加密还是解密,数据keyiv 这三个要素缺一不可。

五、拿到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是怎样解密视频流的。所以这些问题就不在此叙述了,有兴趣的朋友可以翻看我上一篇文章。后续有时间也会发一些比较常见的案例以及解决方法,暂时就写到这了。


如果您觉得这篇文章对您有所帮助,那将会是我莫大的荣幸。
如有不足请予以指正,在此感谢大家的支持和关注,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/970067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重读《Java面试题,10万字208道Java经典面试题总结(附答案)》

最近重读了这篇文章,对很多概念模糊的地方加了拓展和补充。 目录 1、JDK 和 JRE 有什么区别? 2、 和 equals 的区别是什么? 3、final 在 java 中有什么作用? 4、java 中的 Math.round(-1.5) 等于多少? 5、String…

AI知识库 - Cherry Studio

1 引言: 最近 DeepSeek 很火啊,想必大家都知道,DeepSeek 这个开源的模型出来后,因其高质量能力和R1 的思维链引发了大家本地部署的热潮。我也不例外,本地部署了一个 14B 的模型,然后把,感觉傻傻…

Ai笔记本-Ainote(IOS 应用)帮助支持页面

简介 一个 iCloud 实时同步的笔记工具,支持markdown 格式解析、分享 PDF文件。 方便存储各种AI生成的markdown 格式回答,自动保存到 iCloud 永不丢失,支持分享为 PDF 格式笔记。 联系方式 如果您在使用过程中有任何问题或建议,…

1、Prometheus 监控系统(上)

Prometheus 监控系统(上) 认识一下 PrometheusPrometheus 的特点Prometheus 的生态组件Prometheus 的工作模式Prometheus 的工作流程Prometheus 的局限性: 部署 PrometheusPrometheust Server 端安装和相关配置部署 Exporters部署 Node Expor…

【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)

工厂模式(简单工厂、工厂方法、抽象工厂) 介绍 简单工厂模式 简单工厂模式不属于23种GoF设计模式之一,但它是一种常见的设计模式。它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化推迟到子类…

应急响应(linux 篇,以centos 7为例)

一、基础命令 1.查看已经登录的用户w 2.查看所有用户最近一次登录:lastlog 3.查看历史上登录的用户还有登录失败的用户 历史上所有登录成功的记录 last /var/log/wtmp 历史上所有登录失败的记录 Lastb /var/log/btmp 4.SSH登录日志 查看所有日志:…

【实测】用全志A733平板搭建一个端侧Deepseek算力平台

随着DeepSeek 的蒸馏技术的横空出世,端侧 SoC 芯片上运行大模型成为可能。那么端侧芯片跑大模型的效果如何呢?本文将在全志 A733 芯片平台上部署一个 DeepSeek-R1:1.5B 模型,并进行实测效果展示。 端侧平台环境 设备:全志A733平板…

nuxt中引入element-ui组件控制台报错问题

在使用element-ui组件的外层加一层 <client-only placeholder"Loading..."><van-button type"primary">主要按钮</van-button> </client-only> 实际使用&#xff1a; <div class"tab"><client-only placehol…

数据结构(考研)

线性表 顺序表 顺序表的静态分配 //线性表的元素类型为 ElemType//顺序表的静态分配 #define MaxSize10 typedef int ElemType; typedef struct{ElemType data[MaxSize];int length; }SqList;顺序表的动态分配 //顺序表的动态分配 #define InitSize 10 typedef struct{El…

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网&#xff1a;http://www.icetae.com/【更多详情】 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a…

【弹性计算】弹性计算的技术架构

弹性计算的技术架构 1.工作原理2.总体架构3.控制面4.数据面5.物理设施层 虽然弹性计算的产品种类越来越多&#xff0c;但不同产品的技术架构大同小异。下面以当前最主流的产品形态 —— 云服务器为例&#xff0c;探查其背后的技术秘密。 1.工作原理 云服务器通常以虚拟机的方…

EasyRTC轻量级SDK:智能硬件音视频通信资源的高效利用方案

在智能硬件这片广袤天地里&#xff0c;每一份资源的精打细算都关乎产品的生死存亡。随着物联网技术的疾速演进&#xff0c;实时音视频通信功能已成为众多设备的标配。然而&#xff0c;硬件资源的捉襟见肘&#xff0c;让开发者们常常陷入两难境地。EasyRTC&#xff0c;以它的极致…

Linux | 进程相关概念(进程、进程状态、进程优先级、环境变量、进程地址空间)

文章目录 进程概念1、冯诺依曼体系结构2、进程2.1基本概念2.2描述进程-PCB2.3组织进程2.4查看进程2.5通过系统调用获取进程标识符2.6通过系统调用创建进程-fork初识fork の 头文件与返回值fork函数的调用逻辑和底层逻辑 3、进程状态3.1状态3.2进程状态查看命令3.2.1 ps命令3.2.…

【ESP32接入国产大模型之Deepseek】

【ESP32接入国产大模型之Deepseek】 1. Deepseek大模型1.1 了解Deepseek api1.2 Http接口鉴权1.3. 接口参数说明1.3.1 请求体(request)参数1.3.2 模型推理 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析3.3 连续对话修改后的代码代码说明示例输出注…

OSI 参考模型和 TCP/IP 参考模型

数据通信是很复杂的&#xff0c;很难在一个协议中完成所有功能。因此在制定协议时经常采用的思路是将复杂的数据通信功能由若干协议分别完成&#xff0c;然后将这些协议按照一定的方式组织起来。最典型的是采用分层的方式来组织协议&#xff0c;每一层都有一套清晰明确的功能和…

C# CultureInfo 地区影响字符串

问题 线上遇到有玩家资源加载异常&#xff0c;发现资源路径出现异常字符&#xff1a; 发现是土耳其语下字符串转小写不符合预期&#xff1a; "I".ToLower() -> ı 解决方案 String.ToLower 改成 String.ToLowerInvariant 全局修改禁用文化差异&#xff1a;ht…

蓝桥与力扣刷题(108 将有序数组转换成二叉搜索树)

题目&#xff1a;给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9]…

python学opencv|读取图像(六十二)使用cv2.morphologyEx()形态学函数实现图像梯度处理

【1】引言 前序已经学习了腐蚀和膨胀的单独作用函数&#xff0c;还研究了按照不同顺序调用腐蚀和膨胀函数调整图像效果&#xff0c;相关文章包括且不限于&#xff1a; python学opencv|读取图像&#xff08;六十一&#xff09;先后使用cv2.dilate()函数和cv2.erode()函数实现图…

(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念

目录 前言与导论 碎碎念 所以&#xff0c;我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问&#xff0c;他非常好奇…

线程池-抢票系统性能优化

文章目录 引言-购票系统线程池购票系统-线程池优化 池化 vs 未池化 引言-购票系统 public class App implements Runnable {private static int tickets 100;private static int users 10000;private final ReentrantLock lock new ReentrantLock(true);public void run() …