用ffmpeg加密/解密播放CENC的mp4


MPEG Common Encryption (CENC)
說明請參考wiki
https://en.wikipedia.org/wiki/MPEG_Common_Encryption
for ISOBMFF, Common encryption in ISO base media file format files (ISO/IEC 23001-7:2016)

for MPEG-TS, Common encryption of MPEG-2 transport streams (ISO/IEC 23001-9:2016)

確認ffmpeg是否有CENC功能
$ ./ffmpeg -h muxer=mp4 | grep enc
...
  -encryption_scheme      E......... Configures the encryption scheme, allowed values are none, cenc-aes-ctr
  -encryption_key         E......... The media encryption key (hex)
  -encryption_kid         E......... The media encryption key identifier (hex)

用CENC加密mp4
./ffmpeg -i /content/sample.ts \
-c copy \
-encryption_scheme cenc-aes-ctr \
-encryption_key 76a6c65c5ea762046bd749a2e632ccbb \
-encryption_kid a7e61c373e219033c21091fa607bf3b8 \
cenc.mp4

預設只支援AES CTR模式, 可參考wiki解說
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_(CTR)

就是把counter編號(編號起始值可以自訂,就類似IV)拿去加密後再跟明文xor產生密文, 這個方法的好處就是可以把counter的加密結果做成表,加速加密運算的進行。然後解密的時候也支援隨機存取,因為跳到要存取位置可以快速得到counter值, 解密也就不像CBC一樣需要先解出其他明文塊,才能解目前的加密塊。

解密並播放mp4
./ffplay  \
-decryption_key 76a6c65c5ea762046bd749a2e632ccbb \
-i cenc.mp4

參考:FFmpeg CENC加密mp4文件
https://www.jianshu.com/p/ea0761f6aa04

留言