当前位置: 首页 > 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

相关文章:

  • Linux的mmap
  • 【网络安全产品大调研系列】1. 漏洞扫描
  • Deformable DETR:Deformable Transformers for End-to-End Object Detection论文学习
  • Docker快速入门到项目部署
  • 运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点
  • 如何正确计算显示器带宽需求
  • 京东毫秒级热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与面向对象编程:当“魔镜”遇上“家族聚会”
  • 域迁移相关数据集生成脚本