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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务架构学习与思考

参考:微服务架构学习与思考(01):什么是微服务?微服务的优势和劣势 - 九卷 - 博客园 (cnblogs.com) 一、单体应用 在软件开发早期阶段,大家都在一个应用系统上开发。各个业务模块之间耦合也比较紧密。软件发布也是整体发布&#…

实验室LIMS系统 asp.net源码 lims系统源码

LIMS系统是以实验室为中心,将人员、仪器、试剂、方法、环境、文件等影响分析数据的因素有机结合,针对实验室的要求,遵循ISO 17025准则,采用先进的计算机网络技术、数据存储技术、快速和强大的数据处理技术来对实验室进行全面管理的…

【备忘】websocket学习之挖坑埋自己

背景故事 以前没有好好学习过websocket,只知道它有什么用途,也知道是个好东西,平时在工作中没用过,所以对它并不知所以然。如今要做个自己的项目,要在付款的时候实时播报声音。自己是个开发者,也不想用别人…

【XTDrone Ubuntu20.04】XTDrone+ Ubuntu20.04 + PX4安装

XTDrone仿真平台配置 文章目录 XTDrone仿真平台配置依赖安装 ROS一键安装Marvos安装PX4 安装安装QTGroundControlXTDrone下载安装 环境: VMWare 16.0 Ubuntu 22.04 (因为没人配过)Ubuntu 20.04 参考文章: 仿真平台基础配置 (yuq…

还有医学生不知道这个免费好用的在线样本量计算器吗?

相信很多小伙伴都有过这样的经历:做科研设计、撰写论文,设计好主题后摆在眼前的是你最头痛的问题——样本量计算。事实上,样本量计算往往是临床医生做临床研究设计的一大障碍,是临床研究设计、临床知识经验以及统计学知识的结合。…

adguarg通过dns代理全局过滤广告,全系统操作指南

路由器dns配置 安卓(鸿蒙) 设置>>其他网络与连接>>私人DNS(不同手机系统设置名称会有些许出入,但是大差不差) (左图鸿蒙):将域名m.centos.chat填入手机私人DNS IOS系统 将代理服务器IP&am…

React-Router源码分析-History库

history源码 history 在 v5 之前使用单独的包, v6 之后再 router 包中单独实现。 history源码 Action 路由切换的动作类型,包含三种类型: POPREPLACEPUSH Action 枚举: export enum Action {Pop "POP",Push &quo…

核心容器中bean的操作

bean配置 bean基础配置 bean别名配置 **注意事项:**获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException(NoSuchBeanDefinitionException:No bean named ‘bookServiceImpl’ …

多GPU训练大型模型:资源分配与优化技巧 | 英伟达将推出面向中国的改良芯片HGX H20、L20 PCIe、L2 PCIe

★大模型、人工智能;数据并行;模型并行;流水线并行;混合精度训练、梯度累积;模型卸载CPU;重算;模型压缩;内存优化版优化器;Nvidia;A100;H100;A800…

Nutz框架如何自定义SQL?

Nutz框架基本的简单sql已经封装了,但是一些叫为复杂的sql需要手动去写,那如何实现像Mybatis那样通过配置文件编写呢?如有不明白详见官方文档:自定义 SQL - Nutzhttps://nutzam.com/core/dao/customized_sql.html#ndoc-4 一 新建…

Linux - Namespace

一、namespace 是什么? Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没…

Pikachu漏洞练习平台之XXE(XML外部实体注入)

目录 什么是 XML? 什么是DTD? 什么是XEE? 常见payload 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language); XML 不会做任何事情,而是用来结构化、存储以及传输信息…

java接收前端easyui datagrid传递的数组参数

这篇文章分享一下怎么在easyui的datagrid刷新表格时,在后端java代码中接收datagrid传递的数组参数。 数组来源于技能的tagbox(标签框),tagbox和combobox的区别是tagbox可以选择多项。 标签框渲染的代码为 $("#skill_ids"…

确保人工智能的公平性:生成无偏差综合数据的策略

一、介绍 合成数据生成涉及创建密切模仿现实世界数据但不包含任何实际个人信息的人工数据,从而保护隐私和机密性。然而,至关重要的是,这些数据必须以公平、公正的方式生成,以防止人工智能应用中现有的偏见长期存在或扩大。 在数据…

12-2- DCGAN -简单网络-卷积网络

功能 随机噪声→生成器→MINIST图像。 训练方法 1 判别器的训练,首先固定生成器参数不变,其次判别器应当将真实图像判别为1,生成图像判别为0 loss=loss(real_out, 1)+loss(fake_out, 0) 2 生成器的训练,首先固定判别器参数不变,其次判别器应当将生成图像判别为1 loss =…

YOLOv5独家原创改进:最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5独家原创改进:独家首发最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度。 💡对自己数据集改进有效…

TensorFlow案例学习:图片风格迁移

准备 官方教程: 任意风格的快速风格转换 模型下载地址: https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2 学习 加载要处理的内容图片和风格图片 # 用于将图像裁剪为方形def crop_center(image):# 图片原始形状shape image…

微信小程序相机相册授权后,需要重启客户端才能正常调用相机,无法调起窗口选择图片,无反应解决方案

最近微信小程序很多功能突然不能使用,本篇针对无法调起相册进行说明 解决方案 检查小程序隐私协议是否配置,操作步骤这里不在详细说明,点击教程按照上面的教程,找到入口后点击完善或者更新 选择选中的照片或视频这个权限要申请 之…

OpenCV入门4——实现图形的绘制

文章目录 OpenCV绘制直线OpenCV绘制矩形和圆画矩形画圆 OpenCV椭圆的绘制OpenCV绘制多边形OpenCV绘制文本实现鼠标绘制基本图形 OpenCV绘制直线 # -*- coding: utf-8 -*- import cv2 import numpy as npimg np.zeros((480, 640, 3), np.uint8) # 坐标点为(x, y) cv2.line(img,…

Unity | 运行时显示调试信息

「公众号:游戏开发手记」 1 简介 在 Unity 编辑器中,我们可以通过点击 Stats 按钮来查看 Statistics 面板,这个面板显示了许多关于游戏渲染的信息,如每帧的渲染时间、Tris 和 Verts 的数量、SetPass Calls 的数量等。但在其他运…