当前位置: 首页 > article >正文

HLS SAMPLE-AES加密方法

以下为HLS标准中的描述:

An encryption method of SAMPLE-AES means that the Media Segments are Sample Encrypted using the Advanced Encryption Standard[AES_128]. How these media streams are encrypted and encapsulated in a segment depends on the media encoding and the media format of the segment. fMP4 Media Segments are encrypted using the ‘cbcs’ scheme of Common Encryption [COMMON_ENC]. Encryption of other Media Segment formats containing H.264, AAC, AC-3 , and Enhanced AC-3 media streams is described in the HTTP Live Streaming (HLS) Sample Encryption specification [SampleEnc].

以下为结合相关文档整理出的分别对TS和fMp4的加密方法说明

TS

对于TS: 遵循HTTP Live Streaming (HLS) Sample Encryption specification 标准。

  • 对于不同的codec 类型的stream,加密块protected block有不同的定义。audio的一个protected block是一个audio 帧, H.264 类型video的一个protected block是一个NAL单元(network adaptation layer)
  • 每个protected block中包含多个16-byte大小的子block,每个子block都是用AES-128 CBC mode(no padding)加密, 每个新的protected block都需要重置IV到初始值。(注意stream 为multi-slice的情况)
(1) H.264 Video Streams

只对NAL type 为1或5类型的NAL加密,其它类型的NAL不加密,以下为1个加密的NAL数据单元:

//Encryption of NAL units
Encrypted_nal_unit () {
    nal_unit_type_byte                // 1 byte
    unencrypted_leader                // 31 bytes
    while (bytes_remaining() > 0) {
        if (bytes_remaining() > 16) {
            encrypted_block           // 16 bytes
        }
        unencrypted_block           // MIN(144, bytes_remaining()) bytes
    }
}

前32个bytes不加密,之后为protected block, protected block的size小于16 bytes时, 不加密;因此,如果一个NAL的size小于48 bytes(32+16), 则整个NAL都不加密。

protected block使用10%的加密比例,每一个16-byte block的加密数据后跟着9个16-byte block的非加密数据。

为了防止对加密后的NAL中出现start code,需要对加密后的数据再处理一下,在0x0000 和 0x00/0x01/0x02/0x03之间添加0x03作为start code emulation prevention byte。

(2) AAC Audio Streams

一个AAC的protected block是一帧audio frame,包含audio data transport stream (ADTS)header

//Encryption of AAC Audio Frames
Encrypted_AAC_Frame () {
    ADTS_Header                        // 7 or 9 bytes
    unencrypted_leader                 // 16 bytes
    while (bytes_remaining() >= 16) {
        encrypted_block                // 16 bytes
    }
    unencrypted_trailer                // 0-15 bytes
}

ADTS header不加密,剩余的数据以16-byte作为一个block进行加密,最后不足16-byte的数据不加密

fMP4

对于fMP4: 遵循Common Encryption中定义的cbcs加密方法;

ModeFull Sample EncryptionPattern Encryption
AES CTR‘cenc’‘cens’
AES CBC‘cbc1’‘cbcs’

cbcs 属于 AES CBC模式中的 subSample Pattern Encryption
对于AES-CBC模式,需要对每个subSample的第一个加密块(block)设置IV
对于AES-CTR模式,需要对每个Sample的第一个加密块(block)设置IV

(1) audio

audio 使用 whole-block full-sample encryption.
整个sample都是protect部分,每个sample从第0个字节开始加密直到最后16-byte的边界,末尾最后0~15-byte不加密。每个sample都要重置IV

(2) video

video 使用 Pattern Encryption.
Pattern Encryption 是对SubSample中的protect 部分按照16 byte进行分块加密。
Subsample 的protect部分只包含video slice data, 不包含NAL size, NAL type, video slice header 或者其他 NAL type, 非protect的部分都作为clear数据。

推荐加密比例为 encrypt:skip = 1:9, 每160-byte为一重复单元。最后剩余不足160-byte的, 如果>16-byte, 则16-byte加密,剩余的skip;如果<16-byte, 则都skip.

加密序列举例:16-byte enc, 144-byte skip, 16-byte enc, 144-byte skip,…,16-byte enc, 121-byte skip.

Reference
  • MPEG-2 Stream Encryption Format for HTTP Live Streaming
  • Emulation Prevention
  • Common Encryption (CENC)
  • HTTP Live Streaming 2nd Edition draft-pantos-hls-rfc8216bis-13
  • International Organization for Standardization,
    “Information technology – MPEG systems technologies –
    Part 7: Common encryption in ISO base media file format
    files”, ISO/IEC International Standard 23001-7:2016,
    February 2016

http://www.kler.cn/a/383479.html

相关文章:

  • 法语nous sommes
  • 某华迪加现场大屏互动系统mobile.do.php任意文件上传
  • Java高效学习家教平台系统小程序源码
  • OpenAI大事记;GPT到ChatGPT参数量进化
  • UML的另一个主角——用例图
  • 怎么在哔哩哔哩保存完整视频
  • 京东毫秒级热key探测框架JD-hotkey
  • 哈希表,哈希桶及配套习题
  • 数据分析:转录组差异fgsea富集分析
  • 第08章 排序ORDER BY
  • 创新实践:基于边缘智能+扣子的智慧婴儿监控解决方案
  • 歌词结构的艺术:写歌词的技巧和方法深度剖析,妙笔生词AI智能写歌词软件
  • 一篇掌握springboot集成gRPC
  • dcdc3节锂电池串联9-12V升压32V 3A/5A 音响供电恒压芯片 SL4010
  • CentOS 7 更换软件仓库
  • 【LeetCode】返回链表的中间结点、删除链表的倒数第 N 个结点
  • C#如何锁定和解除鼠标及键盘BlockInput
  • 08LangChain实战课 - 输出解析器深入与Pydantic解析器实战
  • 数据结构计算二叉树节点的个数
  • 代码随想录-字符串-实现strStr()--KMP
  • qgis加载获取远程wms数据失败
  • 【C++篇】无序中的法则:探索 STL之unordered_map 与 unordered_set容器的哈希美学
  • php Rides 存入list类型,然后拿2000条,后去除Rides2000条
  • SpringBoot整合Freemarker(二)
  • PHP反射API与面向对象编程:当“魔镜”遇上“家族聚会”
  • 域迁移相关数据集生成脚本