文献学习:
《Data Hiding in Encrypted H.264/AVC Video Streams by Codeword Substitution》
期刊:IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY
简介
通过分析H.264/AVC编解码器的特性,提出了三个敏感部分(IPM、MVD和残差系数)用流密码加密。与[13]相比,该算法不是在H.264/AVC编码时进行加密,而是在H.264/AVC压缩域中进行加密。在H.264压缩域进行选择加密已经在上下文自适应变长编码(CAVLC)和上下文自适应算术编码(CABAC)中被实现,在本文中,我们对之前提出的方法进行了改进和增强,对更多的语法元素进行加密。我们对ipm的码字、mvd的码字和残差系数的码字进行了加密。加密的比特流仍然是符合H.264/AVC的,可以用任何符合标准的H.264/AVC解码器解码,但加密的视频数据与明文视频数据完全不同。实际上,直接在压缩的比特流上执行格式兼容加密是极其复杂的,因为编码器内部的状态必须被保留,否则,其余的数据会被错误地解释,这很容易导致格式违规。
1)帧内预测模式加密
根据H.264/AVC标准,支持以下四种类型的帧内编码,分别表示为Intra_4 × 4, Intra_16×16,I_PCM[12]。这里选择Intra_4×4和Intra_16 × 16块中的IPM进行加密。Intra_16×16中四种IPMs (intra prediction mode)模式都是可行的。Intra_16 × 16块的IPM在mb_type (macroblock type)字段中指定,该字段还指定了关于该块的其他参数,如编码块模式(CBP)。表1是mb_type值及其含义的列表,取自标准[17]。在H.264/AVC基线配置文件中,mb_type是用Exp-Golomb代码编码的。为了使加密的比特流符合标准,我们可以在不修改CBP的情况下对IPM的码字进行加密。另外,为了保持码字的长度不变,加密后的码字应该与原始码字的大小相同。可以看到,CBP组合每四行相同,每连续两行码字长度相同,如表所示。因此,对于Intra_16 × 16块,IPM加密是通过在码字的最后一位和伪随机序列的一位之间应用逐位异或操作来实现的,以保持CBP的值和码字的长度不变。
**在H.264/AVC中,每个Intra_4 × 4亮度块都是根据其空间相邻样本进行预测的。**具体地说, H.264/AVC为Intra_4×4亮度块提供了9种预测模式(0-8)。对于4×4亮度块的每种预测模式的选择必须向解码器发送信号,这可能需要大量的比特。为了有效地压缩预测模式数据,将预测编码技术应用于信号预测模式。
对于当前考虑的每个块E,最可能的模式(MPME)被定义为空间相邻的上块A和左块B的预测模式中较小的那个。如果相邻区块中有一个不可用,则对应的值设为2,表示“DC”预测模式。当前考虑的块E的预测模式记为ModeE。如果ModeE= MPME,码字保持不变。否则,每个码字中的三位固定长度代码(表示为X)用伪随机序列加密(按位异或加密),伪随机序列是由加密密钥E_Key2确定的标准安全密码(例如RC4)生成的。
从上面的描述可以看出,加密码字的长度与原始码字的长度是相同的。对于在解码过程中的格式兼容性,加密后的第一行和/或第一列的块的ipms应该有可解码的值,因为没有相邻块,所以不是所有的模式都可以在每一帧的顶部和左侧边界上使用。在我们的方案中,**如果加密后的IPM对边界块不可用,则此块的IPM加密将被跳过。这也进一步说明IPM加密在某些特定位置不够安全,应与其他加密方法结合使用。**总之,IPM加密意味着在不违反语义和比特流兼容性的情况下将实际模式更改为另一种模式。
运动矢量差(MVD)加密:
为了同时保护纹理信息和运动信息,不仅要对ipm进行加密,还要对运动矢量进行加密。在H.264/AVC中,进一步对运动矢量进行运动矢量预测,得到MVD。在H.264/AVC标准中,采用Exp-Golomb熵编码对MVD进行编码。Exp-Golomb的码字构造为[M Zeros][1][INFO],其中INFO是一个携带信息的M位字段。**表II显示了mvd的值及其对应的Exp-Golomb码字。码字的最后一位通过使用标准流密码应用逐位异或操作进行加密,标准流密码由加密密钥E_Key3确定。**由表二可知,最后一位加密可能会改变MVD的符号,但不影响码字的长度,满足格式遵从性。也就是说,生成的密文仍然是有效的Exp-Golomb代码。例如,“2”对应的码字为“00100”,“−2”对应的码字为“00101”,两者长度相同。需要注意的是,当MVD的值为0时,其对应的码字“1”在加密过程中保持不变。
残差数据加密:
为了保持高安全性,另一类敏感数据,即i帧和p帧两者中的残差数据应该加密。本节详细介绍了一种基于码字特性的残差数据加密方法。H.264编码标准中,采用CAVLC熵编码对残差块[19]的量化系数进行编码。每个CAVLC码字可以表示为以下格式:
为了保持比特流的一致性,在加密过程中不能修改所有的语法元素。例如,Coef f_token、Total_zeros和Run_before 应该保持不变。因此,残余数据加密可以通过修改Sign_of_TrailingOnes和Level的码字来实现。
Sign_of_TrailingOnes是用单比特编码的。比特0被分配给+1,比特1分配给-1 。Sign_of_TrailingOnes的码字通过使用标准流密码应用按位异或操作进行加密(秘钥E_Key4)。每个Level的码字由前缀组成(level_prefix)和后缀(level_suffix)组成:
表三显示了不同suffixLength的Level和相应的码字。码字的最后一位通过使用标准流密码应用逐位异或操作进行加密,标准流密码由加密密钥E_Key5确定。由表三可知,最后一位加密可能会改变level的符号,但不影响码字的长度,满足格式兼容性。例如:当suffixLength = 1时,“2”对应的码字为“010”,“-2”对应的码字为“011”,长度相同。需要注意的是,当suffixLength等于0时,码字在加密过程中应该保持不变。
实验结果:
ESEYE播放效果: