HLSの復号メモ

暗号化されたtsファイルの復号

*.tsファイルとAES-128のキーをファイルとして保存します。

復号の補足説明

暗号化はAES-128 CBCモードでされているのでキーの他にIVが必要になります。
IVはEXT-X-KEY:の中に記述されていますが、省略されている場合はIVは0になります。
EXT-X-MEDIA-SEQUENCEの数値をsprintf(“%032x”, num)したものがIVになります。

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5,
#EXT-X-KEY:METHOD=AES-128,URI="https://www(略)" <= AES-128の復合キー
0_p000(略).ts
#EXT-X-ENDLIST

goで復号するとこんな感じになります。

package main

import (
    "os"
    "bufio"
    "crypto/aes"
    "crypto/cipher"
)

func main() {
    decryptFile("1.ts", "1_decrypted.ts", "1.key", []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    decryptFile("2.ts", "2_decrypted.ts", "2.key", []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    decryptFile("3.ts", "3_decrypted.ts", "3.key", []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})

}
func decryptFile(input_file_path string, output_file_path string, key_file_path string, iv []byte) {
    key_file , _ := os.Open(key_file_path)
    ts_file, _ := os.Open(input_file_path)

    defer key_file.Close()
    defer ts_file.Close()

    bufio_key := bufio.NewReader(key_file)
    bufio_ts := bufio.NewReader(ts_file)

    key_raw_bytes := make([]byte, 16)
    bufio_key.Read(key_raw_bytes)

    block , _ := aes.NewCipher(key_raw_bytes)
    aes_block := cipher.NewCBCDecrypter(block, iv)

    decrypt_ts_file, _ := os.Create(output_file_path)
    defer decrypt_ts_file.Close()

    for {
        ts_raw_bytes := make([]byte, 16)
        read_count, _ := bufio_ts.Read(ts_raw_bytes)

        if (read_count == 0) {
            break
        }

        decrypt_bytes := make([]byte, 16)
        aes_block.CryptBlocks(decrypt_bytes, ts_raw_bytes)
        decrypt_ts_file.Write(decrypt_bytes)
    }

}

一部記事を削除。