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

news2024/11/26 20:47:11

目录

一、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.coloradmin.cn/o/1216868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java GUI实现贪吃蛇游戏

贪吃蛇是一款经典的游戏,玩法相对简单但富有挑战性。以下是贪吃蛇游戏的基本玩法说明: 目标:控制一条蛇,在游戏区域内吃到尽可能多的食物,使蛇身变长,同时避免撞到自己的身体或游戏区域的边界。 控制&…

SQL题

[极客大挑战 2019]EasySQL 进行简单的尝试,就知道是单引号的字符型注入 万能密码进行一个简单的尝试 结果就出来了 还是要了解一下原理 输入的是1,形成的sql语句是错误的SELECT*FROM table_name WHERE username1and password123; 第一个单引号和第二个…

[代码实战和详解]VGG16

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

国内领先的五大API接口供应商

API(Application Programming Interface)接口,现在很多应用系统中常用的开放接口,对接相应的系统、软件功能,简化专业化的程序开发。作者用过的国内比较稳定的API接口供应商有如下几家,大家可以参考选择&am…

论文学习——THE USTC SYSTEM FOR ADRESS-M CHALLENGE

文章目录 引言正文Abstract模型基本结构模型效果汇总 Introduction介绍跨语言任务的独特性思路启发和变化如何使用预定义好的音频特征如何使用预定义好的语言模型——语言模型中获取韵律信息结果说明 Dataset数据集Mthods方法使用设计好的特征进行AD检测使用的特征分类和训练方…

【原创】java+swing+mysql通讯录管理系统设计与实现

前言: 通讯录管理系统是一个设计和实现个人或组织之间联系人信息管理的系统。该系统可能涵盖了联系人的详细信息,如姓名、电话号码、电子邮件地址、地址等,并提供了对联系人信息进行添加、删除、修改、查询等操作的功能。通讯录管理系统旨在…

Android设计模式--状态模式

真知即所以为行,不行不足谓之知 一,定义 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 这么说可能很难理解,通俗来讲就是当一个对象它有多种状态的时候,把每一种状态的行为…

【科普】储能EMS的嵌入式系统该如何选择?

来源:飞凌嵌入式官网 引言 储能EMS(能源管理系统)是专门针对储能系统设计和实施的管理系统,它在新型储能系统领域起到了至关重要的作用。储能EMS能够帮助企业或者机构实现储能设备的高效、安全和可靠管理,优化能源的储…

LeetCode热题100——二分查找

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

vue-router配置

1、路由安装 npm install vue-router4 2、创建router目录 3、编辑文件且引入router包 4、main.js引入

【C++面向对象】13. 接口 / 抽象类*

文章目录 【 1. 抽象类 】1.1 抽象类的定义1.2 抽象类的应用条件1.3 实例 【 2. 设计策略 】 接口描述了类的行为和功能,而不需要完成类的特定实现。C 接口是使用 抽象类(abstract base class,也称为ABC) 来实现的。 【 1. 抽象类…

《C++避坑神器·二十》C++智能指针简单使用

智能指针&#xff0c;自动释放所指向的对象。 头文件 #include <memory>shared_ptr 允许多个指针指向同一个对象 unique_ptr 独占所指向的对象 weak_ptr 指向shared_ptr所管理的对象 作用原理&#xff1a;在函数作用域结束时调用析构函数自动释放资源。 shared_ptr: …

数据结构-二叉树力扣题

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

基于操作系统讨论Java线程与进程、浅谈Go的线程与管程

文章目录 操作系统中的进程进程概念进程的状态 Java中的进程Java进程的概念Java进程的特性Java进程的状态Java进程与操作系统进程的通信 操作系统的进程和Java进程的区别联系操作系统进程Java 进程区别和联系 操作系统中的线程动机优点多核编程 Java中的线程定义&#xff1a;特…

ping命令使用示例解析

【一】ping命令简介 ping &#xff08;Packet Internet Groper&#xff09;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序。ping的一般用途有&#xff1a; ①【测试网络物理链路是否正常】&#xff1a;通过将ICMP(Internet控制消息协议)回显数据包发送到网络终端&…

Unity中Shader图形流水线中的纹理

文章目录 前言一、图形流水线中的纹理1、我们的纹理一般用于&#xff1a;2、纹理的获取方式&#xff1a; 二、纹理的分类1、颜色纹理2、几何纹理 三、纹理管线四、纹理的作用1、纹理可以 替换 漫反射模型中的 漫反射系数Kd2、纹理还有的作用 前言 Unity中Shader图形流水线中的…

【入门篇】1.3 redis客户端之 jedis 高级使用示例

文章目录 0.前言1. 发布和订阅消息2. 事务操作3. 管道操作4. jedis 支持哨兵模式5. jedis 支持集群模式5. 参考链接 0.前言 Jedis是Redis的Java客户端&#xff0c;它支持所有的Redis原生命令&#xff0c;使用方便&#xff0c;且可以与Java项目无缝集成。 该库的最新版本支持Re…

C#创建并调用dll

文章目录 1.VS2019创建C#主程序2.编译主程序3.添加类库工程&#xff0c;并添加计算逻辑4.给主程序添加引用项5.重新编译主程序6.主程序添加测试逻辑 1.VS2019创建C#主程序 2.编译主程序 debug目录下生成exe&#xff1a; 3.添加类库工程&#xff0c;并添加计算逻辑 添加计算逻…

ROS 多机器人导航RVIZ环境的配置

文章目录 前言一、添加多个2D Pose Estimate/2D nav Goal二、RVIZ的其他配置1.RobotModel 总结 前言 前文ROS Turtlebot3多机器人编队导航仿真写了多机器人呢导航的代码实现&#xff0c;本文主要说明&#xff0c;RVIZ导航环境的配置&#xff0c;如何添加多个2D Pose Estimate/…