ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录

一、cenc-aes-ctr 原理介绍  

二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr

三、加密工具---ffmpeg

四、播放---ffplay

五、总结


​​​​​​​一、cenc-aes-ctr 原理介绍  

  1. 加密算法:CENC-AES-CTR 使用 AES(Advanced Encryption Standard)算法进行加密。

  2. CTR 模式:CENC-AES-CTR 使用 CTR(Counter)模式进行加密。CTR 模式将明文分成固定大小的数据块,然后使用加密密钥和初始化向量(IV)生成密钥流,将密钥流与明文数据块进行异或操作,得到密文数据块。CTR 模式具有高度的并行性和随机性,可以有效保护数据的安全性。

  3. 样本级别加密:CENC-AES-CTR 对媒体文件进行样本级别的加密,即对媒体文件中的每个样本(视频帧、音频帧等)进行独立的加密处理。每个样本都使用不同的 IV 和加密索引,以确保每个样本的加密唯一性。

  4. 加密参数:CENC-AES-CTR 加密方案使用一组加密参数来确保正确的解密。这些参数包括加密密钥、密钥标识符(KID)、加密索引、初始化向量(IV)等。加密参数可以存储在加密文件的元数据中或通过其他方式进行传递。

  5. 解密过程:在解密时,解密器使用相同的加密参数来还原加密过程。解密器使用加密索引和 IV 生成相应的密钥流,并将密钥流与密文数据块进行异或操作,以还原明文数据。

简单理解就是,

        将未加密的MP4文件进行加密时,加密工具会生成一个随机的16字节的初始化向量(IV),使用该IV以及你提供的KID进行加密操作,加密后的MP4问价内部除了本来原有的视频数据,还会多了一些加密信息,包括KID和IV。然后在接收端通过Key来进行解密

        注意:KID和IV都会随着密文一起传输,而非手动输入。IV手动输入的是其他的aes-ctr算法。但Key需要额外传输,不会随密文传输。也就是说,解密的时候仅需告知对方Key即可,IV会从文件中读取。

        另外,IV 通常为16字节的16进制数据,当然8字节也是可以的,如果是8字节的那么后面的8字节统一设置为0,下图就是生成的 8 字节IV的, cenc是算法名称,即你采用的什么算法。

二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr

        cenc-aes-ctr 再细分的话还可以分为显式和隐式两种。

        显式cenc-aes-ctr会在加密的MP4文件中的【moov】字段下生成【senc】、【saio】、【saiz】三个字段,见下图。

【senc】:是一个用于存储样本级别加密信息的 Box(箱)。它包含了加密样本的相关信息,如加密算法、密钥标识符(KID)、加密索引、初始化向量(IV)等。

【saio】:用于指示加密样本的辅助信息(如清晰度信息、时序信息等)的位置偏移。它指示了 Sample Auxiliary Information Sizes Box(【saiz】)和 Sample Auxiliary Information Data Box(【saiz】)的位置偏移,以便在解密时正确解析和使用这些辅助信息。

【saiz】:用于指示加密样本的辅助信息的大小。它存储了加密样本的辅助信息的字节大小,以便在解密时正确解析和使用这些辅助信息。【saiz】Box 在加密的 MP4 文件中出现在 Sample Table Box(stbl)中,并与【saio】Box 相关联。

        隐式的cenc-aes-ctr加密则不会载【moov】字段下生成,可能【moof】字段下,也可能都没显示,需要通过其他数据推断出IV。

三、加密工具---ffmpeg

        目前研究下来,只有ffmpeg支持显式的CENC-AES-CTR加密算法,还没找到其他的工具。

        ffmpeg加密命令如下:

ffmpeg -i test2.mp4  -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key c7e16c4403654b85847037383f0c2db3 -encryption_kid a7e61c373e219033c21091fa607bf3b8 encrypted_IV_test.mp4

命令说明

test2.mp4 为输入文件

encrypted_IV_test.mp4 为输出文件

-vcodec copy 和 -acodec copy :指定视频流和音频流的编码方式为原始流的拷贝,即不进行重新编码,保持与原始文件相同的编码格式。

-encryption_scheme cenc-aes-ctr :设置加密方案为 CENC-AES-CTR,即采用 CTR 模式进行加密。

-encryption_key c7e16c4403654b85847037383f0c2db3 指定加密所使用的密钥,即解密所使用的 key。这里的c7e16c4403654b85847037383f0c2db3 是一个示例密钥,您可以替换为您自己的密钥。

-encryption_kid a7e61c373e219033c21091fa607bf3b8:指定加密所使用的密钥标识符(KID)。这里的 a7e61c373e219033c21091fa607bf3b8 是一个示例 KID,您可以替换为您自己的密钥标识符。

      上一篇文章提到的IV参数,对于该算法实际上是不生效的,即使设置了encryption_IV的值,实际上根据cenc-aes-ctr算法要求,也是会被忽略掉的。还是随机生成的。故此处iv可以不写。

     对于隐式的cenc-aes-ctr 加密工具,bento4。命令如下:

 mp4encrypt --method MPEG-CENC --key 1:c7e16c4403654b85847037383f0c2db3:random --property 1:KID:a7e61c373e219033c21091fa607bf3b8 fragmented.mp4 animal_test_decrypted_random_only_one_8.mp4

命令说明:

--method MPEG-CENC : 加密算法为 MPEG-CENC ,这里MPEG-CENC里面其实包含了很多种加密算法,其中之一就是cenc-aes-ctr,根据后面的参数来决定是哪一种算法

--key 1:c7e16c4403654b85847037383f0c2db3:random : c7e16c4403654b85847037383f0c2db3就是ffmpeg里面的key。random 是必须的,含义是动态生成16字节的iv。如果这里不用random,用具体的值,则不属于cenc-aes-ctr了。

--property 1:KID:a7e61c373e219033c21091fa607bf3b8 :对应ffmpeg的kid

fragmented.mp4 输入文件

animal_test_decrypted_random_only_one_8.mp4 输出文件

上面的bento4就是隐式的cenc-aes-ctr命令

四、播放---ffplay

       ffplay 命令如下

ffplay animal_test_decrypted_not_random_only_one_8.mp4 -decryption_key c7e16c4403654b85847037383f0c2db3

animal_test_decrypted_not_random_only_one_8.mp4 : 播放的文件

-decryption_key c7e16c4403654b85847037383f0c2db3 : 解密用的key c7e16c4403654b85847037383f0c2db3

        注意:对与ffplay4.4版本,也就是ffmpeg 4.4版本,是不支持隐式 cenc-aes-ctr 解密的,也就是说,只有在加密文件中存在【senc】、【saio】、【saiz】三个字段时,才能播放,否则会播放错误,错误信息如下:

        但是对于 ffplay 6.0版本,则不会报错,会正常播放。

对于4.4 无法播放的问题,原因是ffmpeg 在播放cenc-aes-ctr加密的视频时,回去寻找对应的s【senc】字段,然后读该字段内部的加密信息。而隐式的cenc-aes-ctr加密算法,是没有【senc】字段的,因此ffmpeg就认为是默认的iv解密方式,iv就是初始值0,与实际的iv是不匹配的。就解析失败了。

而6.0则不是直接查找senc字段,所以就不会有这个问题。

五、总结

        如果想用ffmpeg4.4版本来播放 cenc-aes-ctr 加密的MP4 资源,那只能使用ffmpeg进行加密,加密不需要必须4.4,6.0版本也可以。如果你用的加密工具加密后【moov】缺少【senc】字段,那就是隐式的,就必须6.0版本播放,4.4版本无法播放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/194197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之工厂模式 ( Factory Pattern )(1)

其他设计模式也会后续更新… 设计模式其实需要有一定开发经验才好理解,对代码有一定的设计要求,工作中融入才是最好的 工厂模式 ( Factory Pattern ) 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式 工厂模式在创建对…

【MATLAB源码-第79期】基于蚯蚓优化算法(EOA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 蚯蚓优化算法(Earthworm Optimisation Algorithm, EOA)是一种启发式算法,灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…

交换机如何配置BGP协议

环境: 华为交换机 华三交换机 问题描述: 交换机如何配置BGP协议 解决方案: 华三交换机上配置案例 1.配置BGP协议,可以按照以下步骤进行: 登录交换机:使用SSH、Telnet或控制台等方式登录到华三交换…

个人简历管理系统winform

说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于C#winform架构和sql server数据库 功能模块: 个人简历管理系统 简历信息添加 修改 删除 查询简历 运行环境: 运行需vs2013或者以上版本&#xff0…

golang 解析oracle 数据文件头

package mainimport ("encoding/binary""fmt""io""os" ) // Powered by 黄林杰 15658655447 // Usered for parser oracle datafile header block 1 .... // oracle 数据文件头块解析 // KCBlockStruct represents the structure of t…

桂院校园导航 | 云上高校导航 云开发项目 二次开发教程 1.3

Gitee代码仓库:桂院校园导航小程序 GitHub代码仓库:GLU-Campus-Guide 演示视频 中国大学生计算机设计大赛-移动应用与开发-云上高校导航 升级日志 1.3 优化了小程序的数据存储方式,对部分页面进行了调整,调整了功能和代码。 引…

数据结构-二叉树力扣题

目录 1.相同的树 2.二叉树中查找值为x的节点 3.单值二叉树 4.对称二叉树 5.二叉树的前序遍历 6.另一颗树的子树 层序遍历: 7.二叉树遍历 8.判断二叉树是否是完全二叉树 一个特殊的性质: 1.相同的树 题目链接:力扣(LeetC…

DSP生成hex方法

以下使用两种方法生成的HEX文件,亲测可用 (1)万能法 不管.out文件是哪个版本CCS编译器生成的,只要用HEX2000.exe软件,翻译都可以使用。方法: hex2000 -romwidth 16 -memwidth 16 -i -o 20170817chuankou…

CentOS修改root用户密码

一、适用场景 1、太久没有登录CentOS系统,忘记管理密码。 2、曾经备份的虚拟化OVA或OVF模板,使用模板部署新系统后,忘记root密码。 3、被恶意攻击修改root密码后的紧急修复。 二、实验环境 1、VMware虚拟化的ESXI6.7下,通过曾经…

博物馆信息展示预约小程序的效果如何

随着大环境放开,如博物馆等场所也开始了正常营业,而这些场所在市场中中的需求度很广,每天客流量也相对可观。 但依然发现博物馆痛点所在。 通过【雨科】平台搭建博物馆小程序展示所有内容信息,覆盖微信、百度、头条、抖音、支付宝…

听GPT 讲Rust源代码--library/core/src(8)

题图来自 Hello, crustaceans. File: rust/library/core/src/future/ready.rs 在Rust源代码中,rust/library/core/src/future/ready.rs文件的作用是定义了一个名为Ready的Future类型。Ready是一个简单的Future实现,它立即返回一个给定的值。 Ready 是一个…

[代码实战和详解]VGG16

VGG16 详解 我的github代码实现:vgg16 我们在vgg16神经网络上训练了SIGNS数据集,这是一个分类的数据集,在我的github上有介绍怎么下载数据集以及如何训练。 VGG16是一个卷积神经网络(CNN)架构,它在2014年…

高防CDN:构筑网络安全的钢铁长城

在当今数字化的世界里,网络安全问题日益突显,而高防CDN(高防御内容分发网络)正如一座坚不可摧的钢铁长城,成为互联网安全的不可或缺之物。本文将深入剖析高防CDN在网络安全环境中的关键作用,探讨其如何构筑…

linux套接字-Socket

1.概念 局域网和广域网 局域网:局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。IPInternet Protocol)&#…

LeetCode热题100——二分查找

二分查找 1. 搜索插入位置2. 搜素二维矩阵3. 在排序数组中查找第一个和最后一个元素位置 1. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 // 题…

一款快速从数据库中提取信息工具

DataMiner 介绍 DataMiner是一款数据库自动抽取工具,用于快速从数据库中提取信息,目前支持 mysql、mssql、oracle、mongodb等数据库,可导出CSV、HTML。 功能 支持对所有数据库数据进行采样,并指定采样数量。 支持对指定数据库…

MIB 6.1810操作系统实验:准备工作(Tools Used in 6.1810)

6.1810 / Fall 2023 实验环境: Ubuntuxv6实验必要的依赖环境能通过make qemu进入系统 $ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-ri…

手把手教你搭建属于自己的快递小程序

在数字化时代,小程序已经成为各行各业连接用户、提供服务、创造价值的重要工具。其中,快递寄件小程序因其实用性和广泛的需求,成为很多企业和开发者关注的焦点。本文将详细介绍如何快速创建快递寄件小程序,以及如何利用它实现盈利…

DVWA - 3

文章目录 XSS(Dom)lowmediumhighimpossible XSS(Reflected)lowmediumhighimpossible XSS(Stored)lowmediumhighimpossible XSS(Dom) XSS 主要基于JavaScript语言进行恶意攻击&#…

创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意

文章目录 1、连接到数据库2、创建表空间3、创建用户4、授予权限5、测试 1、连接到数据库 sqlplus / as sysdba2、创建表空间 创建testtab表空间 CREATE TABLESPACE testtab DATAFILE /u01/app/oracle/oradata/orcl/testtab.dbf SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE …