当前位置: 首页 > news >正文

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版本无法播放。

相关文章:

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

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法:CENC-AES-CTR 使用 AES(Advanced Encryption Standard&…...

网络安全/黑客技术(0基础入门到进阶提升)

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…...

栈的三道oj【C++】

栈和队列的相关oj 最小栈思路解决代码 栈的压入弹出序列思路解决代码 逆波兰表达式思路:解决代码 这里就挑了三道题用来熟悉栈 最小栈 力扣链接 咱们已经是高贵的C使用者了,不用像C语言一样从头开始造轮子了 这里我们调用了stack后,就会发…...

AI大模型低成本快速定制法宝:RAG和向量数据库

文章目录 1. 前言2. RAG和向量数据库3. 论坛日程4. 购票方式 1. 前言 当今人工智能领域,最受关注的毋庸置疑是大模型。然而,高昂的训练成本、漫长的训练时间等都成为了制约大多数企业入局大模型的关键瓶颈。 这种背景下,向量数据库凭借其独特…...

文旅媒体有哪些?如何邀请到现场报道?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 中国文旅产业在近年来得到了持续而快速的发展。从产业端看,中国文旅产业呈现出新的发展趋势,其中“文旅”向“文旅”转变成为显著特点。通过产业升级和空间构建&a…...

搭建知识付费系统的最佳实践是什么

在数字化时代,搭建一个高效且用户友好的知识付费系统是许多创业者和内容创作者追求的目标。本文将介绍一些搭建知识付费系统的最佳实践,同时提供一些基本的技术代码示例,以帮助你快速入门。 1. 选择合适的技术栈: 搭建知识付费…...

计算机视觉:使用opencv实现车牌识别

1 引言 汽车车牌识别(License Plate Recognition)是一个日常生活中的普遍应用,特别是在智能交通系统中,汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起,以准…...

用封面预测书的价格【图像回归】

今天,我将介绍计算机视觉的深度学习应用,用封面简单地估算一本书的价格。 我没有看到很多关于图像回归的文章,所以我为你们写这篇文章。 距离我上一篇文章已经过去很长时间了,我不得不承认,作为一名数据科学家&#x…...

阿里云服务器e实例40G ESSD Entry系统盘、2核2G3M带宽99元

阿里云99元服务器新老用户同享2核2G经济型e实例、3M固定带宽和40G ESSD Entry系统盘,老用户也可以买,续费不涨价依旧是99元一年,阿里云百科aliyunbaike.com分享阿里云3M带宽服务器40G ESSD Entry云盘性能说明: 阿里云99元服务器配…...

Datawhale智能汽车AI挑战赛

1.赛题解析 赛题地址:https://tianchi.aliyun.com/competition/entrance/532155 任务: 输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);输出:对视频中的信息进行综合理解&…...

pyclipper和ClipperLib操作多边型

目录 1. 等距离缩放多边形 1.1 python 1.2 c 1. 等距离缩放多边形 1.1 python 环境配置pip install opencv-python opencv-contrib-python pip install pyclipper pip install numpy import cv2 import numpy as np import pyclipperdef equidistant_zoom_contour(contour…...

Golang 协程、主线程

Go协程、Go主线程 1)Go主线程(有程序员直接称为线程/也可以理解成进程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程。 2)Go协程的特点 有独立的栈空间 共享程序堆空间 调度由用户控制 协程是轻量级的线程 go线程-…...

【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析

【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析 一、sensor_detect_device():MAX96712 检测解串器芯片是否存在,获取chip_id、device_revision二、sensor_detect_device_channels() :MAX96712 解串器 寄存器初始化 及 detec…...

pandas教程:Apply:General split-apply-combine 通常的分割-应用-合并

文章目录 10.3 Apply:General split-apply-combine(应用:通用的分割-应用-合并)1 Suppressing the Group Keys(抑制组键)2 Quantile and Bucket Analysis(分位数与桶分析)3 Example:…...

第一讲之递归与递推下篇

第一讲之递归与递推下篇 带分数费解的开关飞行员兄弟翻硬币 带分数 用暴力将所有全排列的情况都算出来 > 有三个数,a,b,c 每种排列情况,可以用两层for循环,暴力分为三个部分,每个部分一个数 当然注意这里,第一层fo…...

第十六篇-Awesome ChatGPT Prompts-备份

Awesome ChatGPT Prompts——一个致力于提供挖掘ChatGPT能力的Prompt收集网站 https://prompts.chat/ 2023-11-16内容如下 ✂️Act as a Linux Terminal Contributed by: f Reference: https://www.engraved.blog/building-a-virtual-machine-inside/ I want you to act as a…...

Python Web框架Django

Python Web框架Django Django简介第一个Django应用Django核心概念Django django-adminDjango项目结构Django配置文件settingsDjango创建和配置应用Django数据库配置Django后台管理Django模型Django模型字段Django模型关联关系Django模型Meta 选项Django模型属性ManagerDjango模…...

1.Spring的简单使用

简介 本文是介绍spring源码的开始,先了解最基础的使用,最深入源码。 spring源码下载地址 https://github.com/spring-projects/spring-framework.git 依赖 依赖 spring-context dependencies {implementation(project(":spring-context")…...

02.智慧商城——vant组件库使用和vw适配

01. vant组件库及Vue周边的其他组件库 组件库:第三方封装好了很多很多的组件,整合到一起就是一个组件库。 https://vant-contrib.gitee.io/vant/v2/#/zh-CN/ 比如日历组件、键盘组件、打分组件、下拉筛选组件等 组件库并不是唯一的,常用的组…...

Android笔记(十三):结合JetPack Compose和CameraX实现视频的录制和存储

在“Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能”,文中介绍了拍照功能的实现,在本文中将介绍结合JetPack Compose和CameraX实现视频的录制。 新建一个项目 在项…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...