解密使用 AES-128 加密的 M3U8 播放列表,无需 IV

Tob*_*ler 2 c# aes http-live-streaming m3u8

我目前正在构建一个用于下载 M3U8 播放列表的应用程序,但我遇到了一个问题:如果播放列表是用 AES-128 加密的,例如有这样一行:

#EXT-X-KEY:METHOD=AES-128,URI="https://website.com/link.key",IV=0xblablabla

我必须在将它们写入输出文件之前解密这些段,如果存在 IV,则下面的代码对我有用,但如果 IV 属性不存在,则解密会产生错误的结果:

var iv = "parsed iv"; // empty if not present
var key_url = "parsed keyurl";

var AES = new AesManaged()
{
    Mode = CipherMode.CBC,
    Key = await Client.GetByteArrayAsync(key_url)
};

if (!string.IsNullOrEmpty(iv))
    AES.IV = Functions.HexToByte(iv.StartsWith("0x") ? iv.Remove(0, 2) : iv);
else
    AES.IV = new byte[16];

//...

using (FileStream fs = new FileStream("file.ts", FileMode.Create, FileAccess.Write, FileShare.Read))
{
    var data = DownloadSegment(...); // Downloads segment as byte array (encrypted)

    byte[] temp = new byte[data.Length];

    ICryptoTransform transform = AES.CreateDecryptor();
    using (MemoryStream memoryStream = new MemoryStream(data))
    {
        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Read))
        {
            cryptoStream.Read(temp, 0, data.Length);
        }
    }

    await fs.WriteAsync(temp, 0, temp.Length);
}
Run Code Online (Sandbox Code Playgroud)

(这显然只是一个代码片段,包含解密部分,因为所有解析和下载都可以正常工作)。

如果不存在 IV,你们中有人知道如何解密 M3U8 播放列表文件中的 AES-128 加密段,例如只是

#EXT-X-KEY:METHOD=AES-128,URI="https://website.com/link.key"?

任何帮助是极大的赞赏。提前致谢!

jms*_*msn 6

HLS 规范指出 [1]:

AES-128 的一种加密方法表明媒体段已使用高级加密标准 (AES) [AES_128] 和 128 位密钥、密码块链接 (CBC) 和公钥加密标准 #7 (PKCS7) 完全加密填充 [RFC5652]。CBC 在每个段边界上重新启动,使用初始化向量 (IV) 属性值或媒体序列号作为 IV;见第 5.2 节。

所以你必须EXT-X-MEDIA-SEQUENCE在变体播放列表中使用标签的值。一定要外推,即为每个段增加它。

[1] https://tools.ietf.org/html/rfc8216#section-4.3.2.4