我有几千个带有.key和.m3u8文件的AES-128加密音频文件.
密钥文件只包含一个由44个字符组成的密钥..m3ud文件似乎是某种类型的播放列表.
#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="http://localhost:[port]/hls/keys/nax_9781843794066.key"
#EXTINF:10,
http://localhost:[port]/filesequence0000000.ts
#EXTINF:10,
etc...
Run Code Online (Sandbox Code Playgroud)
请注意,密钥URI和.ts文件的路径现在都是错误的.
环顾四周,看来ffmpeg可能适用于这种格式.但我不确定语法.
如何解密和组合这些文件?
我一直在玩修复播放列表语法,并弄清楚如何使用ffmpeg并得到.
ffmpeg -i nax_9781843794066.m3u8 -c copy output.ts
ffmpeg version N-77197-gdf2ce13 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 5.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
libavutil 55. 10.100 / 55. 10.100
libavcodec 57. 17.100 / 57. 17.100
libavformat 57. 19.100 / 57. 19.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 20.100 / 6. 20.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
[hls,applehttp @ 0000003e6348a660] Error when loading first segment 'filesequence0000000.ts'
nax_9781843794066.m3u8: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)
filesequence0000000.ts是第一个文件,在同一个文件夹中.我不知道这是加密或其他什么问题.
这是关键文件,如果重要的话: MoOoNvcKlThWBm2T+VzYq9QKZLw7MFUqSyLYjiwquTQ=
aer*_*tal 12
最新版本的ffmpeg应该能够解密AES-128 HLS流.您不需要网络服务器.如果m3u8URI /路径错误,您可以:
my.key其放在目录中.请注意,如果播放列表有多个键,则可以旋转键,将所有键复制到不同的文件中..ts段复制到同一目录playlist.m3u8并仅使用密钥(URI)和段的文件名.获取单个.ts文件做:
ffmpeg -i playlist.m3u8 -c copy output.ts
Run Code Online (Sandbox Code Playgroud)如果你只想要没有.ts容器的音频流,你可以提取它.例如:假设您使用AAC编解码器运行时有一个音频流:
ffmpeg -i playlist.m3u8 -map 0:a -c copy output.aac
Run Code Online (Sandbox Code Playgroud)这将在AAC不重新编码的情况下将流提取到文件.如果您想要一个与源不同的编解码器,则必须重新编码.
如果由于某种原因你必须使用openssl解密段,请记住,如果没有IV指定,那么IV它等于段的媒体序列,即.第一段有IV=0,第二段有IV=1,依此类推.解密后,更新播放列表以指向解密的段并删除该EXT-X-KEY行.如果你走这条路线你甚至不需要ffmpeg来获得单个.ts文件,因为MPEG-TS可以直接连接,即.你可以cat在解密的段上使用.
我今天有几个空闲时间并玩弄这个。长话短说——base64 密钥是 AES 加密的。这种额外的加密是使用从设备数据动态生成的密钥完成的...这意味着即使我拥有您设备中的整个数据文件夹,我也无法解密它。
现在,当您拥有带有离线数据的 root 设备时,那就是另一回事了 - 您显然可以注入代码以在解密时拦截密钥,以便内容可以开始播放......这就是我得到它的方式。
当您拥有正确的密钥时,解密和加入 *.ts 文件就很简单了。我建议您使用 FFMPEG 来完成此任务,我留下用于说明的 C# 代码仅在某些情况下运行良好(取决于文件的编码方式):
var folder = "path_to_folder";
byte[] encryptionKey = File.ReadAllBytes(folder + "path_to_key.key");
var outputFile = "c:\\i_love_you_guys.ts";
using (FileStream outputFileStream = new FileStream(outputFile, FileMode.Create))
{
var files = Directory.GetFiles(folder, "*.ts");
for (int i = 0; i < files.Length; i++)
{
byte[] encryptionIV = new byte[16];
using (FileStream inputFileStream = new FileStream(files[i], FileMode.Open))
{
using (var aes = new AesManaged { Key = encryptionKey, IV = encryptionIV, Mode = CipherMode.CBC })
using (var encryptor = aes.CreateDecryptor())
using (var cryptoStream = new CryptoStream(inputFileStream, encryptor, CryptoStreamMode.Read))
{
cryptoStream.CopyTo(outputFileStream);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,这结果是一场徒劳的追逐。@aergistal 在他的回答中所说的只要你有正确的my.key. 因此,专注于以纯格式获取密钥,解密将变得非常容易。
| 归档时间: |
|
| 查看次数: |
15234 次 |
| 最近记录: |