web-dev-qa-db-fra.com

Déchiffrer et combiner des fichiers audio .ts avec .m3u8

J'ai quelques milliers de fichiers .ts cryptés AES-128 avec un fichier .key et .m3u8.

Le fichier de clés contient uniquement une clé composée de 44 caractères. Les fichiers .m3ud semblent constituer un type de liste de lecture.

#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...

Notez que l'URI de clé et le chemin d'accès aux fichiers .ts sont maintenant incorrects.

En regardant autour, il semble que ffmpeg pourrait fonctionner avec ce format. Mais je ne suis pas sûr de la syntaxe.

Comment puis-je décrypter et combiner ces fichiers?

Je me suis amusé à corriger la syntaxe de la liste de lecture et à comprendre comment utiliser ffmpeg et ainsi de suite.

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

filesequence0000000.ts est le premier fichier, dans le même dossier. Je ne peux pas dire s'il y a un problème de cryptage ou autre chose.

Ceci est le fichier clé, si cela compte: MoOoNvcKlThWBm2T+VzYq9QKZLw7MFUqSyLYjiwquTQ=

8
Jonathon

J'ai eu quelques heures libres aujourd'hui et j'ai joué avec ça. Longue histoire courte - cette clé base64 est cryptée AES. Ce chiffrement supplémentaire est effectué avec une clé générée dynamiquement à partir des données de l'appareil ... ce qui signifie que même si j'ai un dossier de données complet sur votre appareil, je ne pourrais pas le déchiffrer.

Maintenant, lorsque vous possédez un appareil enraciné avec des données hors connexion, c’est un autre problème: vous pouvez évidemment injecter votre code pour intercepter la clé lorsqu’elle est déchiffrée afin que le contenu puisse commencer à être lu ... c’est ainsi que je l’ai obtenu.

Lorsque vous avez la clé appropriée, le décryptage et la jonction des fichiers * .ts sont triviaux. Je vous recommande d'utiliser FFMPEG pour cette tâche, le code C # que je laisse à titre d'illustration ne fonctionne bien que dans dans certains cas (selon le mode de codage des fichiers ):

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);
            }
        }
    }
}

Donc, cela s'est avéré être une chasse à l'oie sauvage. Ce que @aergistal dit dans sa réponse est tout à fait valable tant que vous avez le bon my.key. Il sera donc extrêmement facile de se concentrer sur l’obtention de la clé au format clair et sur le déchiffrement.

3
kape123

Les versions récentes de ffmpeg devraient pouvoir déchiffrer les flux AES-128 HLS. Vous n'avez pas besoin d'un serveur Web. Si les __ID et les chemins m3u8 sont incorrects, vous pouvez:

  • créer un répertoire
  • copiez la clé dans un fichier de clé, c'est-à-dire my.key, et placez-la dans le répertoire. Notez que vous pouvez faire pivoter les touches si la liste de lecture contient plusieurs clés et les copier dans des fichiers différents.
  • copier tous les segments .ts dans le même répertoire
  • copier et éditer le playlist.m3u8 et utiliser uniquement le nom du fichier pour l’URL et les segments de clé (s).
  • pour obtenir un seul fichier .ts, procédez comme suit:

    ffmpeg -i playlist.m3u8 -c copy output.ts
    
  • si vous voulez seulement le flux audio sans le conteneur .ts, vous pouvez l'extraire. Par exemple, si vous avez un seul flux audio utilisant le codec AAC:

    ffmpeg -i playlist.m3u8 -map 0:a -c copy output.aac
    

Cela extraira le flux AAC dans un fichier sans réencodage. Si vous voulez un codec différent de votre source, vous devrez ré-encoder.

Si, pour une raison quelconque, vous devez utiliser openssl pour déchiffrer les segments, gardez à l'esprit que si aucune variable IV n'est spécifiée, la variable IV est égale à la séquence multimédia du segment, c'est-à-dire. le premier segment a IV=0, le second a IV=1 et ainsi de suite. Après le déchiffrement, mettez à jour la liste de lecture pour qu'elle pointe les segments déchiffrés et supprime la ligne EXT-X-KEY. Si vous choisissez cette voie, vous n’avez même pas besoin de ffmpeg pour obtenir un seul fichier .ts car MPEG-TS est directement concaténable, c’est-à-dire. vous pouvez simplement utiliser cat sur les segments déchiffrés.

10
aergistal