视频TS文件AES加密处理

此处理对象仅限于视频TS文件,不包括其他图文数据。
加密算法:
此算法选用AES(Advanced Encryption Standard,高级加密标准)加密算法,固定秘钥长度:128bit(16字节),分组密码使用ECB模式。
填充方式:
AES的区块长度固定为128bit(16字节),当源视频TS文件的大小不是16字节的整数倍时,需要进行数据填充。
此方案采用通过对原视频TS文件进行预处理,用填充整数个TS空包的方式使其满足数据区块长度是128bit(16字节)的整数倍。预处理后的数据再进行AES加密,就不需要进行数据填充。同时,插入的TS空包也不会影响到视频的播放质量。
注:此方式只针对TS包:188字节长度进行填充,不适用于其他封装格式的音视频文件。
处理流程:
此方案可将流程分成以下几个主要步骤:
1.预处理:完成对视频TS文件的数据填充工作,使其满足数据区块长度是16字节的倍数。
2.加密处理:使用AES加密算法对预处理后的TS文件进行加密。
3.切片封装:最后对加密过后的文件进行切片、封装,并进行数据推送。
前端推送系统与终端系统完整的处理流程如下图所示:
预处理:
针对视频TS文件大小总是:188字节整数倍的情况。TS文件的总大小(单位:字节)总是可转换成:(188 * X)的形式(X的值由TS文件的大小决定)。
假设需要填充的TS空包数为:Y,则满足:(188 * ( X + Y )) % 16 == 0,即满足16的整数倍。
(188 * ( X + Y )) % 16 == 0 可进一步转换成: (47 * ( X + Y )) % 4 == 0
我们通过计算:(X % 4 )余数。
1.当余数为0时,表示不需要填充,此时Y为0。
2.当余数不为0时:计算 4 - (X % 4 ),即可得到需要填充的最小TS包数Y。
Y的值范围:(0,1,2,3),即最坏情况下,需填充3个TS空包,最好的情况下则不需要填充。
根据标准:ISO-13818-1的规定,PID值为:0x1FFF,表示Null Packet空包。在需要填充时,可直接在源TS文件的末尾追加填充空包。
AES加密:
AES的数据区块长度固定为128比特,密钥长度则可以是128,192或256比特,此方案使用秘钥长度为:128bit;分组密码使用ECB模式(Electronic Codebook Book,电码本模式)。加密的过程是将整个明文分成若干段相同的小段,然后对每一小段进行加密,并最后组合成最终的密文。
其加密处理内部流程如下所示:
视频TS文件AES加密处理_第1张图片

测试用例:
前期为验证终端在进行硬件解密播放时的效果,及对快进,快退,总时长获取的方面的影响。暂先提供一个固定秘钥加密处理后的TS文件,供终端测试使用。后续再考虑针对不同的视频TS文件指定不同的秘钥进行加密。
测试阶段,暂约定秘钥:0x12,0x34。
长度不足用0x00补齐,使其总长度为16字节,完整的秘钥:
0x12,0x34,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00.

Linux/Unix下提供相关工具,可用于密文的生成:

#openssl enc -aes-128-ecb -in src.ts -out aes.ts -e -K 1234 -nosalt -nopad -p

1、 src.ts:为预处理后的TS文件,若直接使用源视频TS文件,可能会被其使用默认填充方式填充,导致密文结尾处不一致。
2、 aes.ts:为加密处理后的输出文件。
3、-K 1234 :指定秘钥,后接16进制的密码。1234 实际为: 0x12 0x34 0x00 0x00 ….(不足16字节用0x00补齐)。
4、-nosalt:防止工具对秘钥进行加扰再处理。
5、-nopad:不对数据进行填充。

AES加密解密方法详细说明:
1.AES加密(无需padding,主要针对16*n字节)
(1)设置输入输出指针,引入数据
(2)设置秘钥,为16字节。暂定为0x12,0x34,后面全补0
(3)定义结构体aes_context,此结构体用来存储处理后的加密秘钥
(4)调用aes_setkey_enc处理秘钥,处理后的秘钥是加密秘钥
这里写图片描述
传入aes_context、key、keysize,将key进行处理并存放在aes_context中
(5)调用aes_crypt_file
这里写图片描述
传入输入数据指针,数据尺寸,处理过的key和输出数据指针
此函数调用aes_crypt_ecb,即采用ECB加密模式,加密数据
这里写图片描述
此处的参数AES_ENCRYPT为加密模式,解密时需要更改为AES_DECRYPT
(5)数据加密完毕
2.AES解密
解密和加密基本相同
(1)引入数据
(2)设置秘钥(1234)
(3)定义aes_context,存放处理后的解密秘钥
(4)调用aes_setkey_dec处理秘钥,处理后的秘钥为解密秘钥
注:此函数会调用aes_setkey_enc,轮置秘钥(round keys),非常复杂
(5)调用aes_crypt_file,采用ECB加密模式。注意aes_crypt_ecb的参数应该改为AES_DECRYPT
(6)数据解密完毕
3.AES加密(需要padding,主要针对非16*n的TS视频文件)
(1)设置输入输出TS文件的路径信息
(2)设置秘钥(1234)
(3)调用aes_enc
这里写图片描述
传入输入文件路径、输出文件路径、key
此函数会创建新文件存储加密后的文件。

4.AES解密(padding)
(1)设置输入输出TS文件的路径信息
(4)设置秘钥(1234)
(2)调用aes_enc
注意,需要将此函数所调用的aes_setkey_enc改为aes_setkey_dec
aes_crypt_file所调用的aes_crypt_ecb参数改为AES_DECRYPT

你可能感兴趣的:(音视频流,加密,视频,算法)