HLSの復号メモ
📅 2014/05/11
暗号化された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)
}
}
一部記事を削除。