使用.m3u8解密和组合.ts音频文件

Jon*_*hon 8 encryption ffmpeg

我有几千个带有.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在解密的段上使用.

  • @JonathonWisnoski GOT IT.似乎base64密钥以某种方式加密.我设法绕过保护以获得普通的16字节密钥.一旦我有了密钥,我就使用了我昨天编写的实用程序,它可以轻松地将加密的.ts文件转换为一个单独的解密文件.ts.奇怪的是,这适用于IV,它始终为0.现在我有16字节密钥,我将看看是否可以弄清楚base64 44字节密钥如何映射到普通的16字节密钥.如果我弄明白的话,我会尝试开源我的代码,以便其他人可以从我努力解决这个问题中学习;). (2认同)

nik*_*3ro 4

我今天有几个空闲时间并玩弄这个。长话短说——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. 因此,专注于以纯格式获取密钥,解密将变得非常容易。