使用openssl m3u8解密 EXT-X-KEY:METHOD=AES-128,URI=xxx

1.ts

ts是日本高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。ts即"Transport Stream"的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。
大多数在线播放的视频使用ts格式作流媒体传输

2.m3u8

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

通常m3u8包含了若干个ts文件的名称,按播放顺序有序排列,还包括版本、是否加密等信息

下面对AES-128的ts文件解密
.m3u8文件
在这里插入图片描述

F12查看key
在这里插入图片描述

步骤
在这里插入图片描述
openssl aes-128-cbc自动化脚本

#16进制数转ascii码,这个预先生成,最后的0a不要
#hexdump -v -e '16/1 "%02x"' key.key 
#0a4d96498feee8ae
strkey=30613464393634393866656565386165

#一共有120个小文件
for j in $(seq 0 119)
do
  #echo $j
  iv=$(printf '%032x' $j)
  #echo $iv

  input="./ts/"$j".mp4"
  output="./output/"$j"_out.mp4"
  #echo $input
  #echo $output
  openssl aes-128-cbc -d -in $input -out $output -nosalt -iv $iv -K $strkey
done

#openssl aes-128-cbc -d -in 0.mp4 -out 0_out.mp4 -nosalt -iv $iv -K $strkey
[root@localhost ~]# ./aes_run.sh 
[root@localhost ~]# ls ./output/
0_out.mp4    110_out.mp4  13_out.mp4  24_out.mp4  35_out.mp4  46_out.mp4  57_out.mp4  68_out.mp4  79_out.mp4  8_out.mp4
100_out.mp4  111_out.mp4  14_out.mp4  25_out.mp4  36_out.mp4  47_out.mp4  58_out.mp4  69_out.mp4  7_out.mp4   90_out.mp4
101_out.mp4  112_out.mp4  15_out.mp4  26_out.mp4  37_out.mp4  48_out.mp4  59_out.mp4  6_out.mp4   80_out.mp4  91_out.mp4
102_out.mp4  113_out.mp4  16_out.mp4  27_out.mp4  38_out.mp4  49_out.mp4  5_out.mp4   70_out.mp4  81_out.mp4  92_out.mp4
103_out.mp4  114_out.mp4  17_out.mp4  28_out.mp4  39_out.mp4  4_out.mp4   60_out.mp4  71_out.mp4  82_out.mp4  93_out.mp4
104_out.mp4  115_out.mp4  18_out.mp4  29_out.mp4  3_out.mp4   50_out.mp4  61_out.mp4  72_out.mp4  83_out.mp4  94_out.mp4
105_out.mp4  116_out.mp4  19_out.mp4  2_out.mp4   40_out.mp4  51_out.mp4  62_out.mp4  73_out.mp4  84_out.mp4  95_out.mp4
106_out.mp4  117_out.mp4  1_out.mp4   30_out.mp4  41_out.mp4  52_out.mp4  63_out.mp4  74_out.mp4  85_out.mp4  96_out.mp4
107_out.mp4  118_out.mp4  20_out.mp4  31_out.mp4  42_out.mp4  53_out.mp4  64_out.mp4  75_out.mp4  86_out.mp4  97_out.mp4
108_out.mp4  119_out.mp4  21_out.mp4  32_out.mp4  43_out.mp4  54_out.mp4  65_out.mp4  76_out.mp4  87_out.mp4  98_out.mp4
109_out.mp4  11_out.mp4   22_out.mp4  33_out.mp4  44_out.mp4  55_out.mp4  66_out.mp4  77_out.mp4  88_out.mp4  99_out.mp4
10_out.mp4   12_out.mp4  

openssl aes-128加密方式
ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。
例如

openssl aes-128-cbc -d -in 8JgoCJ8p/20.ts -out 8JgoCJ8p/out_20.ts -K 62313737353431616663646439616161 -iv 00000000000000000000000000000000
openssl aes-128-ecb -d -in 8JgoCJ8p/20.ts -out 8JgoCJ8p/out_20.ts -K 62313737353431616663646439616161

合并ts文件,使用ffmpeg清晰的更高

ffmpeg.exe -f concat -safe 0 -i ./filelist.txt -c copy ./test.mp4

filelist.txt:

file '0.ts'
file '1.ts'
file '2.ts'
file '3.ts'
file '4.ts'
file '5.ts'
file '6.ts'
file '7.ts'
file '8.ts'
file '9.ts'
file '10.ts'
file '11.ts'
file '12.ts'

参考
https://blog.youkuaiyun.com/newnewfeng/article/details/52275650

<think>我们正在解决使用OpenSSL解密M3U8文件时遇到的EXT-X-KEY密钥不足16位的问题。在AES-128解密中,密钥长度必须是16字节(128位)。如果提供的密钥不足16字节,通常需要填充到16字节。常见的填充方式有:1.用0填充到16字节(例如,密钥"abc"填充为"abc\0\0...\0",共16字节)2.用密钥重复自身直到填满16字节(例如,密钥"abcabc"则重复成"abcabcabcabcabca",但注意长度要正好16)3.其他方式如PKCS#7填充(但这里密钥本身不是加密数据,而是密码,所以一般不采用PKCS#7)然而,在EXT-X-KEY中,密钥通常以十六进制字符串或Base64字符串形式提供。我们首先要确定密钥的格式。步骤:1.检查M3U8文件中的EXT-X-KEY标签,例如:#EXT-X-KEY:METHOD=AES-128,URI="key.key",IV=0x1234567890abcdef1234567890abcdef2.密钥文件(如key.key)可能是一个二进制文件,也可能是一个十六进制字符串或Base64字符串。需要确认其实际长度。常见错误:-如果密钥文件是文本形式(比如十六进制字符串),那么当读取这个字符串时,其字节长度可能不是16。例如,一个16个字符的十六进制字符串实际上是8字节(因为每个十六进制字符是4位,两个字符一个字节),但我们需要的是16字节的二进制密钥。解决方案:-情况1:密钥是十六进制字符串(例如长度为32的十六进制字符串,代表16字节)。此时,用openssl转换这个十六进制字符串为二进制,然后用这个二进制密钥解密。```bash#将十六进制密钥文件转换成二进制xxd-r-pkey.hex>key.bin```然后使用key.bin作为密钥。-情况2:密钥是Base64编码的。通常,EXT-X-KEY中的密钥是Base64编码的字符串,需要先解码为二进制。Base64编码的16字节密钥长度为24(因为Base64每3字节编码为4字符,16字节需要ceil(16/3)*4=24)。如果长度不足,可能是填充问题?但标准Base64会填充等号。-情况3:密钥长度不足16字节(即二进制长度不足16)。此时需要填充。填充方法没有统一标准,但常见的是在末尾填充0,直到16字节。操作步骤(假设key.key是文本文件,内容是纯文本密钥,且长度不足16字节):1.读取密钥文件内容,假设内容为字符串S。2.将S转换为字节序列,并截取或填充到16字节(用0填充)。3.用填充后的密钥进行解密使用OpenSSL命令行解密时,如果密钥文件内容不足16字节,我们可以用以下方法填充:```bash#假设key.key是文本密钥文件key=$(catkey.key)#将密钥内容转换为二进制并填充0到16字节printf"%-16s""$key">key.bin```注意:`printf"%-16s"`会在字符串后面用空格填充到16字节。但是,这不一定适用,因为密钥可能包含非打印字符,而且空格(0x20)不一定符合要求。更安全的填充方式是使用0字节填充:```bashkey_content=$(catkey.key)#计算需要填充的0的个数len=${#key_content}pad_len=$((16-len))#用dd创建16字节的key.bin,先写入key.key内容,剩余填充0ddif=key.keyof=key.binbs=1count=$lenddif=/dev/zeroof=key.binbs=1count=$pad_lenseek=$lenconv=notrunc```但是,更好的方法可能是用编程语言处理(如Python)或使用OpenSSL提供的填充方式?在OpenSSL命令行中,我们也可以这样:```bash#使用十六进制表示的密钥(如果原始密钥是字符串,需要转换为十六进制形式,再填充00)#例如:原始字符串为"abc",转换成十六进制为616263,然后填充13个00(16字节为32个十六进制字符)#所以填充后的十六进制为:61626300000000000000000000000000#然后使用xxd还原为二进制echo"61626300000000000000000000000000"|xxd-r-p>key.bin```具体步骤需要根据密钥文件的格式来定。另一种常见情况:M3U8URI指向的密钥文件可能是Base64编码的,但实际读取后二进制长度不是16(可能由于Base64解码后刚好16?)。如果Base64编码前的密钥长度不足,那么我们需要知道来源是否正确。建议:1.确认密钥文件的格式(用hexdump查看)2.如果是文本,确认是十六进制还是Base64,或者是普通字符串。如果是普通字符串(比如字母数字组合)且长度小于16,则用0填充到16字节(二进制)是可行的。解密命令示例:```bashopensslaes-128-cbc-d-inencrypted.ts-outdecrypted.ts-iv1234567890abcdef1234567890abcdef-K$(hexdump-v-e'16/1"%02x"'key.bin)```这里,-K参数需要十六进制字符串(32个字符),所以我们把key.bin用hexdump转换成连续的十六进制字符串。或者,直接使用二进制密钥文件和二进制IV文件(如果IV是十六进制字符串,也要转换):```bashopensslaes-128-cbc-d-inencrypted.ts-outdecrypted.ts-iv$(cativ.bin)-K$(catkey.bin)```但是,-K和-iv参数要求是十六进制字符串。所以更推荐上面那种用hexdump的方法。实际上,OpenSSL-K选项要求提供16进制字符串(即32个字符)。因此,我们需要把填充后的二进制密钥文件(key.bin)用xxd或hexdump转换成16进制字符串。总结步骤:1.从M3U8中获取密钥URI,下载密钥文件(例如key.key)。2.确定密钥文件的编码:-如果是Base64编码,用base64解码并检查长度,如果不足16字节则填充0到16字节。-如果是纯文本(如字符串),则将其转换为字节,然后填充0至16字节。-如果是十六进制字符串(长度32则正常,不足则可能需要填充并转换)。3.将处理后的密钥保存为二进制文件(如key.bin),然后转换成OpenSSL命令行所需的十六进制字符串格式(32个十六进制字符)。4.同样处理IV(如果有)。5.使用openssl命令解密每个TS片段。注意:如果M3U8中提供了IV,则使用该IV;如果没有,则OpenSSL默认使用密钥作为IV(不建议,所以最好指定IV)。在EXT-X-KEY中如果有IV标签,则用其值(去掉0x前缀)转换成16字节的二进制(十六进制字符串转二进制,长度为32个字符)。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值