1. 程式人生 > >視訊TS檔案AES加密處理

視訊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檔案,供終端測試使用。後續再考慮針對不同的視訊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