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
加密方法;
Mode | Full Sample Encryption | Pattern 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